/*
	Copyright (c) Microsoft Corporation.  All rights reserved.
*/

/*
	Your use of this file is governed by the Microsoft Services Agreement http://go.microsoft.com/fwlink/?LinkId=266419.
*/

// ---------------------------------------------------------------------
// Definition of public enums.
// ---------------------------------------------------------------------
Type.registerNamespace('Microsoft.Office.WebExtension.MailboxEnums');
Microsoft.Office.WebExtension.MailboxEnums.EntityType = { 
	MeetingSuggestion: "meetingSuggestion",	
    TaskSuggestion: "taskSuggestion", 
	Address: "address", 
	EmailAddress: "emailAddress",
	Url: "url",
	PhoneNumber: "phoneNumber", 
	Contact: "contact" 
};
Microsoft.Office.WebExtension.MailboxEnums.ItemType = { 
	Message: 'message', 
	Appointment: 'appointment'
};
Microsoft.Office.WebExtension.MailboxEnums.ResponseType = { 
    None: "none",
    Organizer: "organizer",
    Tentative: "tentative",
    Accepted: "accepted",
    Declined: "declined"
};
Microsoft.Office.WebExtension.MailboxEnums.RecipientType = {
    Other: "other",
    DistributionList: "distributionList",
    User: "user",
    ExternalUser: "externalUser"
};
Microsoft.Office.WebExtension.MailboxEnums.AttachmentType = {
    File: "file",
    Item: "item"
};
// End of public enums


Type.registerNamespace('OSF.DDA');

OSF.DDA.OutlookAppOm = function OSF_DDA_OutlookAppOm(officeAppContext, targetWindow, appReadyCallback) {
    this.$$d__callAppReadyCallback$p$0 = Function.createDelegate(this, this._callAppReadyCallback$p$0);
    this.$$d__getEwsUrl$p$0 = Function.createDelegate(this, this._getEwsUrl$p$0);
    this.$$d__getDiagnostics$p$0 = Function.createDelegate(this, this._getDiagnostics$p$0);
    this.$$d__getUserProfile$p$0 = Function.createDelegate(this, this._getUserProfile$p$0);
    this.$$d__getItem$p$0 = Function.createDelegate(this, this._getItem$p$0);
    this.$$d__getInitialDataResponseHandler$p$0 = Function.createDelegate(this, this._getInitialDataResponseHandler$p$0);
    OSF.DDA.OutlookAppOm._instance$p = this;
    this._officeAppContext$p$0 = officeAppContext;
    this._appReadyCallback$p$0 = appReadyCallback;
    var $$t_4 = this;
    var stringLoadedCallback = function() {
        if (appReadyCallback) {
            $$t_4._invokeHostMethod$i$0(1, 'GetInitialData', null, $$t_4.$$d__getInitialDataResponseHandler$p$0);
        }
    };
    if (this._areStringsLoaded$p$0()) {
        stringLoadedCallback();
    }
    else {
        this._loadLocalizedScript$p$0(stringLoadedCallback);
    }
}
OSF.DDA.OutlookAppOm._createAsyncResult$i = function OSF_DDA_OutlookAppOm$_createAsyncResult$i(value, errorCode, errorDescription, userContext) {
    var initArgs = {};
    initArgs[OSF.DDA.AsyncResultEnum.Properties.Value] = value;
    initArgs[OSF.DDA.AsyncResultEnum.Properties.Context] = userContext;
    var errorArgs = null;
    if (0 !== errorCode) {
        errorArgs = {};
        errorArgs[OSF.DDA.AsyncResultEnum.ErrorProperties.Name] = errorCode;
        errorArgs[OSF.DDA.AsyncResultEnum.ErrorProperties.Message] = errorDescription;
    }
    return new OSF.DDA.AsyncResult(initArgs, errorArgs);
}
OSF.DDA.OutlookAppOm._throwOnPropertyAccessForRestrictedPermission$i = function OSF_DDA_OutlookAppOm$_throwOnPropertyAccessForRestrictedPermission$i(currentPermissionLevel) {
    if (!currentPermissionLevel) {
        throw Error.create(_u.ExtensibilityStrings.l_ElevatedPermissionNeeded_Text);
    }
}
OSF.DDA.OutlookAppOm._throwOnMethodCallForInsufficientPermission$i = function OSF_DDA_OutlookAppOm$_throwOnMethodCallForInsufficientPermission$i(currentPermissionLevel, requiredPermissionLevel, methodName) {
    if (currentPermissionLevel < requiredPermissionLevel) {
        throw Error.create(String.format(_u.ExtensibilityStrings.l_ElevatedPermissionNeededForMethod_Text, methodName));
    }
}
OSF.DDA.OutlookAppOm._throwOnArgumentType$p = function OSF_DDA_OutlookAppOm$_throwOnArgumentType$p(value, expectedType, argumentName) {
    if (Object.getType(value) !== expectedType) {
        throw Error.argumentType(argumentName);
    }
}
OSF.DDA.OutlookAppOm._throwOnOutOfRange$p = function OSF_DDA_OutlookAppOm$_throwOnOutOfRange$p(value, minValue, maxValue, argumentName) {
    if (value < minValue || value > maxValue) {
        throw Error.argumentOutOfRange(argumentName);
    }
}
OSF.DDA.OutlookAppOm._validateOptionalStringParameter$p = function OSF_DDA_OutlookAppOm$_validateOptionalStringParameter$p(value, minLength, maxLength, name) {
    if ($h.ScriptHelpers.isNullOrUndefined(value)) {
        return;
    }
    OSF.DDA.OutlookAppOm._throwOnArgumentType$p(value, String, name);
    var stringValue = value;
    OSF.DDA.OutlookAppOm._throwOnOutOfRange$p(stringValue.length, minLength, maxLength, name);
}
OSF.DDA.OutlookAppOm._convertToOutlookParameters$p = function OSF_DDA_OutlookAppOm$_convertToOutlookParameters$p(dispid, data) {
    var executeParameters = null;
    switch (dispid) {
        case 1:
        case 2:
        case 12:
        case 3:
            break;
        case 4:
            var jsonProperty = JSON.stringify(data['customProperties']);
            executeParameters = [ jsonProperty ];
            break;
        case 5:
            executeParameters = [ data['body'] ];
            break;
        case 8:
        case 9:
            executeParameters = [ data['itemId'] ];
            break;
        case 7:
            executeParameters = [ OSF.DDA.OutlookAppOm._convertRecipientArrayParameterForOutlook$p(data['requiredAttendees']), OSF.DDA.OutlookAppOm._convertRecipientArrayParameterForOutlook$p(data['optionalAttendees']), data['start'], data['end'], data['location'], OSF.DDA.OutlookAppOm._convertRecipientArrayParameterForOutlook$p(data['resources']), data['subject'], data['body'] ];
            break;
        case 11:
        case 10:
            executeParameters = [ data['htmlBody'] ];
            break;
        default:
            Sys.Debug.fail('Unexpected method dispid');
            break;
    }
    return executeParameters;
}
OSF.DDA.OutlookAppOm._convertRecipientArrayParameterForOutlook$p = function OSF_DDA_OutlookAppOm$_convertRecipientArrayParameterForOutlook$p(array) {
    return (array) ? array.join(';') : null;
}
OSF.DDA.OutlookAppOm._validateAndNormalizeRecipientEmails$p = function OSF_DDA_OutlookAppOm$_validateAndNormalizeRecipientEmails$p(emailset, name) {
    if ($h.ScriptHelpers.isNullOrUndefined(emailset)) {
        return null;
    }
    OSF.DDA.OutlookAppOm._throwOnArgumentType$p(emailset, Array, name);
    var originalAttendees = emailset;
    var updatedAttendees = null;
    var normalizationNeeded = false;
    OSF.DDA.OutlookAppOm._throwOnOutOfRange$p(originalAttendees.length, 0, OSF.DDA.OutlookAppOm._maxRecipients$p, String.format('{0}.length', name));
    for (var i = 0; i < originalAttendees.length; i++) {
        if ($h.EmailAddressDetails.isInstanceOfType(originalAttendees[i])) {
            normalizationNeeded = true;
            break;
        }
    }
    if (normalizationNeeded) {
        updatedAttendees = [];
    }
    for (var i = 0; i < originalAttendees.length; i++) {
        if (normalizationNeeded) {
            updatedAttendees[i] = ($h.EmailAddressDetails.isInstanceOfType(originalAttendees[i])) ? (originalAttendees[i]).emailAddress : originalAttendees[i];
            OSF.DDA.OutlookAppOm._throwOnArgumentType$p(updatedAttendees[i], String, String.format('{0}[{1}]', name, i));
        }
        else {
            OSF.DDA.OutlookAppOm._throwOnArgumentType$p(originalAttendees[i], String, String.format('{0}[{1}]', name, i));
        }
    }
    return updatedAttendees;
}
OSF.DDA.OutlookAppOm.prototype = {
    _initialData$p$0: null,
    _item$p$0: null,
    _userProfile$p$0: null,
    _diagnostics$p$0: null,
    _officeAppContext$p$0: null,
    _appReadyCallback$p$0: null,
    
    get__appName$i$0: function OSF_DDA_OutlookAppOm$get__appName$i$0() {
        return this._officeAppContext$p$0.get_appName();
    },
    
    initialize: function OSF_DDA_OutlookAppOm$initialize(initialData) {
        var ItemTypeKey = 'itemType';
        this._initialData$p$0 = new $h.InitialData(initialData);
        if (1 === initialData[ItemTypeKey]) {
            this._item$p$0 = new $h.Message(this._initialData$p$0);
        }
        else if (3 === initialData[ItemTypeKey]) {
            this._item$p$0 = new $h.MeetingRequest(this._initialData$p$0);
        }
        else if (2 === initialData[ItemTypeKey]) {
            this._item$p$0 = new $h.Appointment(this._initialData$p$0);
        }
        else {
            Sys.Debug.trace('Unexpected item type was received from the host.');
        }
        this._userProfile$p$0 = new $h.UserProfile(this._initialData$p$0);
        this._diagnostics$p$0 = new $h.Diagnostics(this._initialData$p$0, this._officeAppContext$p$0.get_appName());
        $h.InitialData._defineReadOnlyProperty$i(this, 'item', this.$$d__getItem$p$0);
        $h.InitialData._defineReadOnlyProperty$i(this, 'userProfile', this.$$d__getUserProfile$p$0);
        $h.InitialData._defineReadOnlyProperty$i(this, 'diagnostics', this.$$d__getDiagnostics$p$0);
        if (OSF.DDA.OutlookAppOm._instance$p.get__appName$i$0() === 64) {
            $h.InitialData._defineReadOnlyProperty$i(this, 'ewsUrl', this.$$d__getEwsUrl$p$0);
        }
    },
    
    makeEwsRequestAsync: function OSF_DDA_OutlookAppOm$makeEwsRequestAsync(data, callback, userContext) {
        if ($h.ScriptHelpers.isNullOrUndefined(data)) {
            throw Error.argumentNull('data');
        }
        if (data.length > OSF.DDA.OutlookAppOm._maxEwsRequestSize$p) {
            throw Error.argument('data', _u.ExtensibilityStrings.l_EwsRequestOversized_Text);
        }
        OSF.DDA.OutlookAppOm._throwOnMethodCallForInsufficientPermission$i(this._initialData$p$0.get__permissionLevel$i$0(), 2, 'makeEwsRequestAsync');
        var ewsRequest = new $h.EwsRequest(userContext);
        var $$t_4 = this;
        ewsRequest.onreadystatechange = function() {
            if (4 === ewsRequest.get__requestState$i$1()) {
                callback(ewsRequest._asyncResult$p$0);
            }
        };
        ewsRequest.send(data);
    },
    
    recordDataPoint: function OSF_DDA_OutlookAppOm$recordDataPoint(data) {
        if ($h.ScriptHelpers.isNullOrUndefined(data)) {
            throw Error.argumentNull('data');
        }
        this._invokeHostMethod$i$0(0, 'RecordDataPoint', data, null);
    },
    
    recordTrace: function OSF_DDA_OutlookAppOm$recordTrace(data) {
        if ($h.ScriptHelpers.isNullOrUndefined(data)) {
            throw Error.argumentNull('data');
        }
        this._invokeHostMethod$i$0(0, 'RecordTrace', data, null);
    },
    
    trackCtq: function OSF_DDA_OutlookAppOm$trackCtq(data) {
        if ($h.ScriptHelpers.isNullOrUndefined(data)) {
            throw Error.argumentNull('data');
        }
        this._invokeHostMethod$i$0(0, 'TrackCtq', data, null);
    },
    
    convertToLocalClientTime: function OSF_DDA_OutlookAppOm$convertToLocalClientTime(timeValue) {
        var date = new Date(timeValue.getTime());
        var offset = date.getTimezoneOffset() * -1;
        if (this._initialData$p$0 && this._initialData$p$0.get__timeZoneOffsets$i$0()) {
            date.setUTCMinutes(date.getUTCMinutes() - offset);
            offset = this._findOffset$p$0(date);
            date.setUTCMinutes(date.getUTCMinutes() + offset);
        }
        var retValue = this._dateToDictionary$i$0(date);
        retValue['timezoneOffset'] = offset;
        return retValue;
    },
    
    convertToUtcClientTime: function OSF_DDA_OutlookAppOm$convertToUtcClientTime(input) {
        var retValue = this._dictionaryToDate$i$0(input);
        if (this._initialData$p$0 && this._initialData$p$0.get__timeZoneOffsets$i$0()) {
            var offset = this._findOffset$p$0(retValue);
            retValue.setUTCMinutes(retValue.getUTCMinutes() - offset);
            offset = (!input['timezoneOffset']) ? retValue.getTimezoneOffset() * -1 : input['timezoneOffset'];
            retValue.setUTCMinutes(retValue.getUTCMinutes() + offset);
        }
        return retValue;
    },
    
    getUserIdentityTokenAsync: function OSF_DDA_OutlookAppOm$getUserIdentityTokenAsync(callback, userContext) {
        OSF.DDA.OutlookAppOm._throwOnMethodCallForInsufficientPermission$i(this._initialData$p$0.get__permissionLevel$i$0(), 1, 'getUserIdentityTokenAsync');
        this._invokeGetTokenMethodAsync$p$0(2, 'GetUserIdentityToken', callback, userContext);
    },
    
    getCallbackTokenAsync: function OSF_DDA_OutlookAppOm$getCallbackTokenAsync(callback, userContext) {
        OSF.DDA.OutlookAppOm._throwOnMethodCallForInsufficientPermission$i(this._initialData$p$0.get__permissionLevel$i$0(), 1, 'getCallbackTokenAsync');
        if (64 !== this._officeAppContext$p$0.get_appName()) {
            throw Error.notImplemented('The getCallbackTokenAsync is not supported by outlook for now.');
        }
        this._invokeGetTokenMethodAsync$p$0(12, 'GetCallbackToken', callback, userContext);
    },
    
    displayMessageForm: function OSF_DDA_OutlookAppOm$displayMessageForm(itemId) {
        if ($h.ScriptHelpers.isNullOrUndefined(itemId)) {
            throw Error.argumentNull('itemId');
        }
        this._invokeHostMethod$i$0(8, 'DisplayExistingMessageForm', { itemId: itemId }, null);
    },
    
    displayAppointmentForm: function OSF_DDA_OutlookAppOm$displayAppointmentForm(itemId) {
        if ($h.ScriptHelpers.isNullOrUndefined(itemId)) {
            throw Error.argumentNull('itemId');
        }
        this._invokeHostMethod$i$0(9, 'DisplayExistingAppointmentForm', { itemId: itemId }, null);
    },
    
    displayNewAppointmentForm: function OSF_DDA_OutlookAppOm$displayNewAppointmentForm(parameters) {
        var normalizedRequiredAttendees = OSF.DDA.OutlookAppOm._validateAndNormalizeRecipientEmails$p(parameters['requiredAttendees'], 'requiredAttendees');
        var normalizedOptionalAttendees = OSF.DDA.OutlookAppOm._validateAndNormalizeRecipientEmails$p(parameters['optionalAttendees'], 'optionalAttendees');
        OSF.DDA.OutlookAppOm._validateOptionalStringParameter$p(parameters['location'], 0, OSF.DDA.OutlookAppOm._maxLocationLength$p, 'location');
        OSF.DDA.OutlookAppOm._validateOptionalStringParameter$p(parameters['body'], 0, OSF.DDA.OutlookAppOm._maxBodyLength$p, 'body');
        OSF.DDA.OutlookAppOm._validateOptionalStringParameter$p(parameters['subject'], 0, OSF.DDA.OutlookAppOm._maxSubjectLength$p, 'subject');
        if (!$h.ScriptHelpers.isNullOrUndefined(parameters['start'])) {
            OSF.DDA.OutlookAppOm._throwOnArgumentType$p(parameters['start'], Date, 'start');
            var startDateTime = parameters['start'];
            parameters['start'] = startDateTime.getTime();
            if (!$h.ScriptHelpers.isNullOrUndefined(parameters['end'])) {
                OSF.DDA.OutlookAppOm._throwOnArgumentType$p(parameters['end'], Date, 'end');
                var endDateTime = parameters['end'];
                if (endDateTime < startDateTime) {
                    throw Error.argumentOutOfRange('end', endDateTime, _u.ExtensibilityStrings.l_InvalidEventDates_Text);
                }
                parameters['end'] = endDateTime.getTime();
            }
        }
        var updatedParameters = null;
        if (normalizedRequiredAttendees || normalizedOptionalAttendees) {
            updatedParameters = {};
            var $$dict_6 = parameters;
            for (var $$key_7 in $$dict_6) {
                var entry = { key: $$key_7, value: $$dict_6[$$key_7] };
                updatedParameters[entry.key] = entry.value;
            }
            if (normalizedRequiredAttendees) {
                updatedParameters['requiredAttendees'] = normalizedRequiredAttendees;
            }
            if (normalizedOptionalAttendees) {
                updatedParameters['optionalAttendees'] = normalizedOptionalAttendees;
            }
        }
        this._invokeHostMethod$i$0(7, 'DisplayNewAppointmentForm', updatedParameters || parameters, null);
    },
    
    _displayReplyForm$i$0: function OSF_DDA_OutlookAppOm$_displayReplyForm$i$0(htmlBody) {
        if (!$h.ScriptHelpers.isNullOrUndefined(htmlBody)) {
            OSF.DDA.OutlookAppOm._throwOnOutOfRange$p(htmlBody.length, 0, OSF.DDA.OutlookAppOm._maxBodyLength$p, 'htmlBody');
        }
        this._invokeHostMethod$i$0(10, 'DisplayReplyForm', { htmlBody: htmlBody }, null);
    },
    
    _displayReplyAllForm$i$0: function OSF_DDA_OutlookAppOm$_displayReplyAllForm$i$0(htmlBody) {
        if (!$h.ScriptHelpers.isNullOrUndefined(htmlBody)) {
            OSF.DDA.OutlookAppOm._throwOnOutOfRange$p(htmlBody.length, 0, OSF.DDA.OutlookAppOm._maxBodyLength$p, 'htmlBody');
        }
        this._invokeHostMethod$i$0(11, 'DisplayReplyAllForm', { htmlBody: htmlBody }, null);
    },
    
    _invokeHostMethod$i$0: function OSF_DDA_OutlookAppOm$_invokeHostMethod$i$0(dispid, name, data, responseCallback) {
        if (64 === this._officeAppContext$p$0.get_appName()) {
            OSF._OfficeAppFactory.getClientEndPoint().invoke(name, responseCallback, data);
        }
        else if (dispid) {
            var executeParameters = OSF.DDA.OutlookAppOm._convertToOutlookParameters$p(dispid, data);
            var $$t_9 = this;
            window.external.Execute(dispid, executeParameters, function(nativeData, resultCode) {
                if (responseCallback) {
                    var serializedData = nativeData.getItem(0);
                    var deserializedData = JSON.parse(serializedData);
                    responseCallback(resultCode, deserializedData);
                }
            });
        }
        else if (responseCallback) {
            responseCallback(-2, null);
        }
    },
    
    _dictionaryToDate$i$0: function OSF_DDA_OutlookAppOm$_dictionaryToDate$i$0(input) {
        var retValue = new Date(input['year'], input['month'], input['date'], input['hours'], input['minutes'], input['seconds'], (!input['milliseconds']) ? 0 : input['milliseconds']);
        if (isNaN(retValue.getTime())) {
            throw Error.format(_u.ExtensibilityStrings.l_InvalidDate_Text);
        }
        return retValue;
    },
    
    _dateToDictionary$i$0: function OSF_DDA_OutlookAppOm$_dateToDictionary$i$0(input) {
        var retValue = {};
        retValue['month'] = input.getMonth();
        retValue['date'] = input.getDate();
        retValue['year'] = input.getFullYear();
        retValue['hours'] = input.getHours();
        retValue['minutes'] = input.getMinutes();
        retValue['seconds'] = input.getSeconds();
        retValue['milliseconds'] = input.getMilliseconds();
        return retValue;
    },
    
    _getInitialDataResponseHandler$p$0: function OSF_DDA_OutlookAppOm$_getInitialDataResponseHandler$p$0(resultCode, data) {
        if (resultCode) {
            return;
        }
        this.initialize(data);
        (this).displayName = 'mailbox';
        window.setTimeout(this.$$d__callAppReadyCallback$p$0, 0);
    },
    
    _callAppReadyCallback$p$0: function OSF_DDA_OutlookAppOm$_callAppReadyCallback$p$0() {
        this._appReadyCallback$p$0();
    },
    
    _invokeGetTokenMethodAsync$p$0: function OSF_DDA_OutlookAppOm$_invokeGetTokenMethodAsync$p$0(outlookDispid, methodName, callback, userContext) {
        if ($h.ScriptHelpers.isNullOrUndefined(callback)) {
            throw Error.argumentNull('callback');
        }
        var $$t_8 = this;
        this._invokeHostMethod$i$0(outlookDispid, methodName, null, function(resultCode, response) {
            var asyncResult;
            if (resultCode) {
                asyncResult = OSF.DDA.OutlookAppOm._createAsyncResult$i(null, 1, String.format(_u.ExtensibilityStrings.l_InternalProtocolError_Text, resultCode), userContext);
            }
            else {
                var responseDictionary = response;
                if (responseDictionary['wasSuccessful']) {
                    asyncResult = OSF.DDA.OutlookAppOm._createAsyncResult$i(responseDictionary['token'], 0, null, userContext);
                }
                else {
                    asyncResult = OSF.DDA.OutlookAppOm._createAsyncResult$i(null, 1, responseDictionary['errorMessage'], userContext);
                }
            }
            callback(asyncResult);
        });
    },
    
    _getItem$p$0: function OSF_DDA_OutlookAppOm$_getItem$p$0() {
        return this._item$p$0;
    },
    
    _getUserProfile$p$0: function OSF_DDA_OutlookAppOm$_getUserProfile$p$0() {
        OSF.DDA.OutlookAppOm._throwOnPropertyAccessForRestrictedPermission$i(this._initialData$p$0.get__permissionLevel$i$0());
        return this._userProfile$p$0;
    },
    
    _getDiagnostics$p$0: function OSF_DDA_OutlookAppOm$_getDiagnostics$p$0() {
        return this._diagnostics$p$0;
    },
    
    _getEwsUrl$p$0: function OSF_DDA_OutlookAppOm$_getEwsUrl$p$0() {
        OSF.DDA.OutlookAppOm._throwOnPropertyAccessForRestrictedPermission$i(this._initialData$p$0.get__permissionLevel$i$0());
        return this._initialData$p$0.get__ewsUrl$i$0();
    },
    
    _findOffset$p$0: function OSF_DDA_OutlookAppOm$_findOffset$p$0(value) {
        var ranges = this._initialData$p$0.get__timeZoneOffsets$i$0();
        for (var r = 0; r < ranges.length; r++) {
            var range = ranges[r];
            var start = parseInt(range['start']);
            var end = parseInt(range['end']);
            if (value.getTime() - start >= 0 && value.getTime() - end < 0) {
                return parseInt(range['offset']);
            }
        }
        throw Error.format(_u.ExtensibilityStrings.l_InvalidDate_Text);
    },
    
    _areStringsLoaded$p$0: function OSF_DDA_OutlookAppOm$_areStringsLoaded$p$0() {
        var stringsLoaded = false;
        try {
            stringsLoaded = !$h.ScriptHelpers.isNullOrUndefined(_u.ExtensibilityStrings.l_EwsRequestOversized_Text);
        }
        catch ($$e_1) {
        }
        return stringsLoaded;
    },
    
    _loadLocalizedScript$p$0: function OSF_DDA_OutlookAppOm$_loadLocalizedScript$p$0(stringLoadedCallback) {
        var url = null;
        var baseUrl = '';
        var scripts = document.getElementsByTagName('script');
        for (var i = scripts.length - 1; i >= 0; i--) {
            var filename = null;
            var attributes = scripts[i].attributes;
            if (attributes) {
                var attribute = attributes.getNamedItem('src');
                if (attribute) {
                    filename = attribute.value;
                }
                if (filename) {
                    var debug = false;
                    filename = filename.toLowerCase();
                    var officeIndex = filename.indexOf('office_strings.js');
                    if (officeIndex < 0) {
                        officeIndex = filename.indexOf('office_strings.debug.js');
                        debug = true;
                    }
                    if ((officeIndex > 0) && (officeIndex < filename.length)) {
                        url = filename.replace((debug) ? 'office_strings.debug.js' : 'office_strings.js', 'outlook_strings.js');
                        var languageUrl = filename.substring(0, officeIndex);
                        var lastIndexOfSlash = languageUrl.lastIndexOf('/', languageUrl.length - 2);
                        if (lastIndexOfSlash === -1) {
                            lastIndexOfSlash = languageUrl.lastIndexOf('\\', languageUrl.length - 2);
                        }
                        if (lastIndexOfSlash !== -1 && languageUrl.length > lastIndexOfSlash + 1) {
                            baseUrl = languageUrl.substring(0, lastIndexOfSlash + 1);
                        }
                        break;
                    }
                }
            }
        }
        if (url) {
            var head = document.getElementsByTagName('head')[0];
            var scriptElement = null;
            var $$t_H = this;
            var scriptElementCallback = function() {
                if (stringLoadedCallback && (!scriptElement.readyState || (scriptElement.readyState && (scriptElement.readyState === 'loaded' || scriptElement.readyState === 'complete')))) {
                    scriptElement.onload = null;
                    scriptElement.onreadystatechange = null;
                    stringLoadedCallback();
                }
            };
            var $$t_I = this;
            var failureCallback = function() {
                if (!$$t_I._areStringsLoaded$p$0()) {
                    var fallbackUrl = baseUrl + 'en-us/' + 'outlook_strings.js';
                    scriptElement.onload = null;
                    scriptElement.onreadystatechange = null;
                    scriptElement = $$t_I._createScriptElement$p$0(fallbackUrl);
                    scriptElement.onload = scriptElementCallback;
                    scriptElement.onreadystatechange = scriptElementCallback;
                    head.appendChild(scriptElement);
                }
            };
            scriptElement = this._createScriptElement$p$0(url);
            scriptElement.onload = scriptElementCallback;
            scriptElement.onreadystatechange = scriptElementCallback;
            window.setTimeout(failureCallback, 2000);
            head.appendChild(scriptElement);
        }
    },
    
    _createScriptElement$p$0: function OSF_DDA_OutlookAppOm$_createScriptElement$p$0(url) {
        var scriptElement = document.createElement('script');
        scriptElement.type = 'text/javascript';
        scriptElement.src = url;
        return scriptElement;
    }
}






OSF.DDA.Settings = function OSF_DDA_Settings(data) {
    this._rawData$p$0 = data;
}
OSF.DDA.Settings._convertFromRawSettings$p = function OSF_DDA_Settings$_convertFromRawSettings$p(rawSettings) {
    if (!rawSettings) {
        return {};
    }
    if (OSF.DDA.OutlookAppOm._instance$p.get__appName$i$0() === 8) {
        var outlookSettings = rawSettings['SettingsKey'];
        if (outlookSettings) {
            return OSF.DDA.SettingsManager.deserializeSettings(outlookSettings);
        }
    }
    return rawSettings;
}
OSF.DDA.Settings.prototype = {
    _rawData$p$0: null,
    _settingsData$p$0: null,
    
    get__data$p$0: function OSF_DDA_Settings$get__data$p$0() {
        if (!this._settingsData$p$0) {
            this._settingsData$p$0 = OSF.DDA.Settings._convertFromRawSettings$p(this._rawData$p$0);
            this._rawData$p$0 = null;
        }
        return this._settingsData$p$0;
    },
    
    get: function OSF_DDA_Settings$get(name) {
        return this.get__data$p$0()[name];
    },
    
    set: function OSF_DDA_Settings$set(name, value) {
        this.get__data$p$0()[name] = value;
    },
    
    remove: function OSF_DDA_Settings$remove(name) {
        delete this.get__data$p$0()[name];
    },
    
    saveAsync: function OSF_DDA_Settings$saveAsync() {
        var args = [];
        for (var $$pai_4 = 0; $$pai_4 < arguments.length; ++$$pai_4) {
            args[$$pai_4] = arguments[$$pai_4];
        }
        var callback = null;
        var userContext = null;
        if (args && args.length > 0) {
            var currentArgument = args.length - 1;
            if (Function.isInstanceOfType(args[currentArgument])) {
                callback = args[currentArgument];
                currentArgument--;
                if (currentArgument >= 0) {
                    userContext = (args[currentArgument])['asyncContext'];
                }
            }
        }
        if (OSF.DDA.OutlookAppOm._instance$p.get__appName$i$0() === 64) {
            this._saveSettingsForOwa$p$0(callback, userContext);
        }
        else {
            this._saveSettingsForOutlook$p$0(callback, userContext);
        }
    },
    
    _saveSettingsForOutlook$p$0: function OSF_DDA_Settings$_saveSettingsForOutlook$p$0(callback, userContext) {
        var storedException = null;
        try {
            var serializedSettings = OSF.DDA.SettingsManager.serializeSettings(this.get__data$p$0());
            var jsonSettings = JSON.stringify(serializedSettings);
            var settingsObjectToSave = { SettingsKey: jsonSettings };
            OSF.DDA.RichClientSettingsManager.write(settingsObjectToSave);
        }
        catch (ex) {
            storedException = ex;
        }
        if (callback) {
            var asyncResult;
            if (storedException) {
                asyncResult = OSF.DDA.OutlookAppOm._createAsyncResult$i(null, 1, storedException.message, userContext);
            }
            else {
                asyncResult = OSF.DDA.OutlookAppOm._createAsyncResult$i(null, 0, null, userContext);
            }
            callback(asyncResult);
        }
    },
    
    _saveSettingsForOwa$p$0: function OSF_DDA_Settings$_saveSettingsForOwa$p$0(callback, userContext) {
        var serializedSettings = OSF.DDA.SettingsManager.serializeSettings(this.get__data$p$0());
        var $$t_7 = this;
        OSF._OfficeAppFactory.getClientEndPoint().invoke('saveSettingsAsync', function(resultCode, response) {
            if (callback) {
                var asyncResult;
                if (resultCode) {
                    asyncResult = OSF.DDA.OutlookAppOm._createAsyncResult$i(null, 1, String.format(_u.ExtensibilityStrings.l_InternalProtocolError_Text, resultCode), userContext);
                }
                else {
                    var responseDictionary = response;
                    if (!(responseDictionary['error'])) {
                        asyncResult = OSF.DDA.OutlookAppOm._createAsyncResult$i(null, 0, null, userContext);
                    }
                    else {
                        asyncResult = OSF.DDA.OutlookAppOm._createAsyncResult$i(null, 1, responseDictionary['errorMessage'], userContext);
                    }
                }
                callback(asyncResult);
            }
        }, [ serializedSettings ]);
    }
}


Type.registerNamespace('$h');

$h.Appointment = function $h_Appointment(dataDictionary) {
    this.$$d__getOrganizer$p$1 = Function.createDelegate(this, this._getOrganizer$p$1);
    this.$$d__getNormalizedSubject$p$1 = Function.createDelegate(this, this._getNormalizedSubject$p$1);
    this.$$d__getSubject$p$1 = Function.createDelegate(this, this._getSubject$p$1);
    this.$$d__getResources$p$1 = Function.createDelegate(this, this._getResources$p$1);
    this.$$d__getRequiredAttendees$p$1 = Function.createDelegate(this, this._getRequiredAttendees$p$1);
    this.$$d__getOptionalAttendees$p$1 = Function.createDelegate(this, this._getOptionalAttendees$p$1);
    this.$$d__getLocation$p$1 = Function.createDelegate(this, this._getLocation$p$1);
    this.$$d__getEnd$p$1 = Function.createDelegate(this, this._getEnd$p$1);
    this.$$d__getStart$p$1 = Function.createDelegate(this, this._getStart$p$1);
    $h.Appointment.initializeBase(this, [ dataDictionary ]);
    $h.InitialData._defineReadOnlyProperty$i(this, 'start', this.$$d__getStart$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'end', this.$$d__getEnd$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'location', this.$$d__getLocation$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'optionalAttendees', this.$$d__getOptionalAttendees$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'requiredAttendees', this.$$d__getRequiredAttendees$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'resources', this.$$d__getResources$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'subject', this.$$d__getSubject$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'normalizedSubject', this.$$d__getNormalizedSubject$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'organizer', this.$$d__getOrganizer$p$1);
}
$h.Appointment.prototype = {
    
    getEntities: function $h_Appointment$getEntities() {
        return this._data$p$0._getEntities$i$0();
    },
    
    getEntitiesByType: function $h_Appointment$getEntitiesByType(entityType) {
        return this._data$p$0._getEntitiesByType$i$0(entityType);
    },
    
    getRegExMatches: function $h_Appointment$getRegExMatches() {
        OSF.DDA.OutlookAppOm._throwOnMethodCallForInsufficientPermission$i(this._data$p$0.get__permissionLevel$i$0(), 1, 'getRegExMatches');
        return this._data$p$0._getRegExMatches$i$0();
    },
    
    getFilteredEntitiesByName: function $h_Appointment$getFilteredEntitiesByName(name) {
        return this._data$p$0._getFilteredEntitiesByName$i$0(name);
    },
    
    getRegExMatchesByName: function $h_Appointment$getRegExMatchesByName(name) {
        OSF.DDA.OutlookAppOm._throwOnMethodCallForInsufficientPermission$i(this._data$p$0.get__permissionLevel$i$0(), 1, 'getRegExMatchesByName');
        return this._data$p$0._getRegExMatchesByName$i$0(name);
    },
    
    displayReplyForm: function $h_Appointment$displayReplyForm(htmlBody) {
        OSF.DDA.OutlookAppOm._instance$p._displayReplyForm$i$0(htmlBody);
    },
    
    displayReplyAllForm: function $h_Appointment$displayReplyAllForm(htmlBody) {
        OSF.DDA.OutlookAppOm._instance$p._displayReplyAllForm$i$0(htmlBody);
    },
    
    getItemType: function $h_Appointment$getItemType() {
        return Microsoft.Office.WebExtension.MailboxEnums.ItemType.Appointment;
    },
    
    _getStart$p$1: function $h_Appointment$_getStart$p$1() {
        return this._data$p$0.get__start$i$0();
    },
    
    _getEnd$p$1: function $h_Appointment$_getEnd$p$1() {
        return this._data$p$0.get__end$i$0();
    },
    
    _getLocation$p$1: function $h_Appointment$_getLocation$p$1() {
        return this._data$p$0.get__location$i$0();
    },
    
    _getOptionalAttendees$p$1: function $h_Appointment$_getOptionalAttendees$p$1() {
        return this._data$p$0.get__cc$i$0();
    },
    
    _getRequiredAttendees$p$1: function $h_Appointment$_getRequiredAttendees$p$1() {
        return this._data$p$0.get__to$i$0();
    },
    
    _getResources$p$1: function $h_Appointment$_getResources$p$1() {
        return this._data$p$0.get__resources$i$0();
    },
    
    _getSubject$p$1: function $h_Appointment$_getSubject$p$1() {
        return this._data$p$0.get__subject$i$0();
    },
    
    _getNormalizedSubject$p$1: function $h_Appointment$_getNormalizedSubject$p$1() {
        return this._data$p$0.get__normalizedSubject$i$0();
    },
    
    _getOrganizer$p$1: function $h_Appointment$_getOrganizer$p$1() {
        return this._data$p$0.get__organizer$i$0();
    }
}


$h.AttachmentDetails = function $h_AttachmentDetails(data) {
    this.$$d__getIsInline$p$0 = Function.createDelegate(this, this._getIsInline$p$0);
    this.$$d__getAttachmentType$p$0 = Function.createDelegate(this, this._getAttachmentType$p$0);
    this.$$d__getSize$p$0 = Function.createDelegate(this, this._getSize$p$0);
    this.$$d__getContentType$p$0 = Function.createDelegate(this, this._getContentType$p$0);
    this.$$d__getName$p$0 = Function.createDelegate(this, this._getName$p$0);
    this.$$d__getId$p$0 = Function.createDelegate(this, this._getId$p$0);
    this._data$p$0 = data;
    $h.InitialData._defineReadOnlyProperty$i(this, 'id', this.$$d__getId$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'name', this.$$d__getName$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'contentType', this.$$d__getContentType$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'size', this.$$d__getSize$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'attachmentType', this.$$d__getAttachmentType$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'isInline', this.$$d__getIsInline$p$0);
}
$h.AttachmentDetails.prototype = {
    _data$p$0: null,
    
    _getId$p$0: function $h_AttachmentDetails$_getId$p$0() {
        return this._data$p$0['id'];
    },
    
    _getName$p$0: function $h_AttachmentDetails$_getName$p$0() {
        return this._data$p$0['name'];
    },
    
    _getContentType$p$0: function $h_AttachmentDetails$_getContentType$p$0() {
        return this._data$p$0['contentType'];
    },
    
    _getSize$p$0: function $h_AttachmentDetails$_getSize$p$0() {
        return this._data$p$0['size'];
    },
    
    _getAttachmentType$p$0: function $h_AttachmentDetails$_getAttachmentType$p$0() {
        var response = this._data$p$0['attachmentType'];
        return (response < $h.AttachmentDetails._attachmentTypeMap$p.length) ? $h.AttachmentDetails._attachmentTypeMap$p[response] : Microsoft.Office.WebExtension.MailboxEnums.AttachmentType.File;
    },
    
    _getIsInline$p$0: function $h_AttachmentDetails$_getIsInline$p$0() {
        return this._data$p$0['isInline'];
    }
}


$h.Contact = function $h_Contact(data) {
    this.$$d__getContactString$p$0 = Function.createDelegate(this, this._getContactString$p$0);
    this.$$d__getAddresses$p$0 = Function.createDelegate(this, this._getAddresses$p$0);
    this.$$d__getUrls$p$0 = Function.createDelegate(this, this._getUrls$p$0);
    this.$$d__getEmailAddresses$p$0 = Function.createDelegate(this, this._getEmailAddresses$p$0);
    this.$$d__getPhoneNumbers$p$0 = Function.createDelegate(this, this._getPhoneNumbers$p$0);
    this.$$d__getBusinessName$p$0 = Function.createDelegate(this, this._getBusinessName$p$0);
    this.$$d__getPersonName$p$0 = Function.createDelegate(this, this._getPersonName$p$0);
    this._data$p$0 = data;
    $h.InitialData._defineReadOnlyProperty$i(this, 'personName', this.$$d__getPersonName$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'businessName', this.$$d__getBusinessName$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'phoneNumbers', this.$$d__getPhoneNumbers$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'emailAddresses', this.$$d__getEmailAddresses$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'urls', this.$$d__getUrls$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'addresses', this.$$d__getAddresses$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'contactString', this.$$d__getContactString$p$0);
}
$h.Contact.prototype = {
    _data$p$0: null,
    _phoneNumbers$p$0: null,
    
    _getPersonName$p$0: function $h_Contact$_getPersonName$p$0() {
        return this._data$p$0['PersonName'];
    },
    
    _getBusinessName$p$0: function $h_Contact$_getBusinessName$p$0() {
        return this._data$p$0['BusinessName'];
    },
    
    _getAddresses$p$0: function $h_Contact$_getAddresses$p$0() {
        return $h.Entities._getExtractedStringProperty$i(this._data$p$0, 'Addresses');
    },
    
    _getEmailAddresses$p$0: function $h_Contact$_getEmailAddresses$p$0() {
        return $h.Entities._getExtractedStringProperty$i(this._data$p$0, 'EmailAddresses');
    },
    
    _getUrls$p$0: function $h_Contact$_getUrls$p$0() {
        return $h.Entities._getExtractedStringProperty$i(this._data$p$0, 'Urls');
    },
    
    _getPhoneNumbers$p$0: function $h_Contact$_getPhoneNumbers$p$0() {
        if (!this._phoneNumbers$p$0) {
            var $$t_1 = this;
            this._phoneNumbers$p$0 = $h.Entities._getExtractedObjects$i($h.PhoneNumber, this._data$p$0, 'PhoneNumbers', function(data) {
                return new $h.PhoneNumber(data);
            });
        }
        return this._phoneNumbers$p$0;
    },
    
    _getContactString$p$0: function $h_Contact$_getContactString$p$0() {
        return this._data$p$0['ContactString'];
    }
}


$h.CustomProperties = function $h_CustomProperties(data) {
    if ($h.ScriptHelpers.isNullOrUndefined(data)) {
        throw Error.argumentNull('data');
    }
    this._data$p$0 = data;
}
$h.CustomProperties.prototype = {
    _data$p$0: null,
    
    get: function $h_CustomProperties$get(name) {
        var value = this._data$p$0[name];
        if (typeof(value) === 'string') {
            var valueString = value;
            if (valueString.length > 6 && valueString.startsWith('Date(') && valueString.endsWith(')')) {
                var ticksString = valueString.substring(5, valueString.length - 1);
                var ticks = parseInt(ticksString);
                if (!isNaN(ticks)) {
                    var dateTimeValue = new Date(ticks);
                    if (dateTimeValue) {
                        value = dateTimeValue;
                    }
                }
            }
        }
        return value;
    },
    
    set: function $h_CustomProperties$set(name, value) {
        if (OSF.OUtil.isDate(value)) {
            value = 'Date(' + (value).getTime() + ')';
        }
        this._data$p$0[name] = value;
    },
    
    remove: function $h_CustomProperties$remove(name) {
        delete this._data$p$0[name];
    },
    
    saveAsync: function $h_CustomProperties$saveAsync(callback, userContext) {
        var MaxCustomPropertiesLength = 2500;
        if (JSON.stringify(this._data$p$0).length > MaxCustomPropertiesLength) {
            throw Error.argument();
        }
        var saveCustomProperties = new $h._saveDictionaryRequest(callback, userContext);
        saveCustomProperties._sendRequest$i$0(4, 'SaveCustomProperties', { customProperties: this._data$p$0 });
    }
}


$h.Diagnostics = function $h_Diagnostics(data, appName) {
    this.$$d__getOwaView$p$0 = Function.createDelegate(this, this._getOwaView$p$0);
    this.$$d__getHostVersion$p$0 = Function.createDelegate(this, this._getHostVersion$p$0);
    this.$$d__getHostName$p$0 = Function.createDelegate(this, this._getHostName$p$0);
    this._data$p$0 = data;
    this._appName$p$0 = appName;
    $h.InitialData._defineReadOnlyProperty$i(this, 'hostName', this.$$d__getHostName$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'hostVersion', this.$$d__getHostVersion$p$0);
    if (64 === this._appName$p$0) {
        $h.InitialData._defineReadOnlyProperty$i(this, 'OWAView', this.$$d__getOwaView$p$0);
    }
}
$h.Diagnostics.prototype = {
    _data$p$0: null,
    _appName$p$0: 0,
    
    _getHostName$p$0: function $h_Diagnostics$_getHostName$p$0() {
        if (8 === this._appName$p$0) {
            return 'Outlook';
        }
        else if (64 === this._appName$p$0) {
            return 'OutlookWebApp';
        }
        return null;
    },
    
    _getHostVersion$p$0: function $h_Diagnostics$_getHostVersion$p$0() {
        return this._data$p$0.get__hostVersion$i$0();
    },
    
    _getOwaView$p$0: function $h_Diagnostics$_getOwaView$p$0() {
        return this._data$p$0.get__owaView$i$0();
    }
}


$h.EmailAddressDetails = function $h_EmailAddressDetails(data) {
    this.$$d__getRecipientType$p$0 = Function.createDelegate(this, this._getRecipientType$p$0);
    this.$$d__getAppointmentResponse$p$0 = Function.createDelegate(this, this._getAppointmentResponse$p$0);
    this.$$d__getDisplayName$p$0 = Function.createDelegate(this, this._getDisplayName$p$0);
    this.$$d__getEmailAddress$p$0 = Function.createDelegate(this, this._getEmailAddress$p$0);
    this._data$p$0 = data;
    $h.InitialData._defineReadOnlyProperty$i(this, 'emailAddress', this.$$d__getEmailAddress$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'displayName', this.$$d__getDisplayName$p$0);
    if ($h.ScriptHelpers.dictionaryContainsKey(data, 'appointmentResponse')) {
        $h.InitialData._defineReadOnlyProperty$i(this, 'appointmentResponse', this.$$d__getAppointmentResponse$p$0);
    }
    if ($h.ScriptHelpers.dictionaryContainsKey(data, 'recipientType')) {
        $h.InitialData._defineReadOnlyProperty$i(this, 'recipientType', this.$$d__getRecipientType$p$0);
    }
}
$h.EmailAddressDetails._createFromEmailUserDictionary$i = function $h_EmailAddressDetails$_createFromEmailUserDictionary$i(data) {
    var emailAddressDetailsDictionary = {};
    var displayName = data['Name'];
    var emailAddress = data['UserId'];
    emailAddressDetailsDictionary['name'] = displayName || $h.EmailAddressDetails._emptyString$p;
    emailAddressDetailsDictionary['address'] = emailAddress || $h.EmailAddressDetails._emptyString$p;
    return new $h.EmailAddressDetails(emailAddressDetailsDictionary);
}
$h.EmailAddressDetails.prototype = {
    _data$p$0: null,
    
    _getEmailAddress$p$0: function $h_EmailAddressDetails$_getEmailAddress$p$0() {
        return this._data$p$0['address'];
    },
    
    _getDisplayName$p$0: function $h_EmailAddressDetails$_getDisplayName$p$0() {
        return this._data$p$0['name'];
    },
    
    _getAppointmentResponse$p$0: function $h_EmailAddressDetails$_getAppointmentResponse$p$0() {
        var response = this._data$p$0['appointmentResponse'];
        return (response < $h.EmailAddressDetails._responseTypeMap$p.length) ? $h.EmailAddressDetails._responseTypeMap$p[response] : Microsoft.Office.WebExtension.MailboxEnums.ResponseType.None;
    },
    
    _getRecipientType$p$0: function $h_EmailAddressDetails$_getRecipientType$p$0() {
        var response = this._data$p$0['recipientType'];
        return (response < $h.EmailAddressDetails._recipientTypeMap$p.length) ? $h.EmailAddressDetails._recipientTypeMap$p[response] : Microsoft.Office.WebExtension.MailboxEnums.RecipientType.Other;
    }
}


$h.Entities = function $h_Entities(data, filteredEntitiesData, timeSent, permissionLevel) {
    this.$$d__createMeetingSuggestion$p$0 = Function.createDelegate(this, this._createMeetingSuggestion$p$0);
    this.$$d__getContacts$p$0 = Function.createDelegate(this, this._getContacts$p$0);
    this.$$d__getPhoneNumbers$p$0 = Function.createDelegate(this, this._getPhoneNumbers$p$0);
    this.$$d__getUrls$p$0 = Function.createDelegate(this, this._getUrls$p$0);
    this.$$d__getEmailAddresses$p$0 = Function.createDelegate(this, this._getEmailAddresses$p$0);
    this.$$d__getMeetingSuggestions$p$0 = Function.createDelegate(this, this._getMeetingSuggestions$p$0);
    this.$$d__getTaskSuggestions$p$0 = Function.createDelegate(this, this._getTaskSuggestions$p$0);
    this.$$d__getAddresses$p$0 = Function.createDelegate(this, this._getAddresses$p$0);
    this._data$p$0 = data || {};
    this._filteredData$p$0 = filteredEntitiesData || {};
    this._dateTimeSent$p$0 = timeSent;
    $h.InitialData._defineReadOnlyProperty$i(this, 'addresses', this.$$d__getAddresses$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'taskSuggestions', this.$$d__getTaskSuggestions$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'meetingSuggestions', this.$$d__getMeetingSuggestions$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'emailAddresses', this.$$d__getEmailAddresses$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'urls', this.$$d__getUrls$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'phoneNumbers', this.$$d__getPhoneNumbers$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'contacts', this.$$d__getContacts$p$0);
    this._permissionLevel$p$0 = permissionLevel;
}
$h.Entities._getExtractedObjects$i = function $h_Entities$_getExtractedObjects$i(T, data, name, creator, removeDuplicates, stringPropertyName) {
    var results = null;
    var extractedObjects = data[name];
    if (!extractedObjects) {
        return new Array(0);
    }
    if (removeDuplicates) {
        extractedObjects = $h.Entities._removeDuplicate$p(Object, extractedObjects, $h.Entities._entityDictionaryEquals$p, stringPropertyName);
    }
    results = new Array(extractedObjects.length);
    var count = 0;
    for (var $$arr_9 = extractedObjects, $$len_A = $$arr_9.length, $$idx_B = 0; $$idx_B < $$len_A; ++$$idx_B) {
        var extractedObject = $$arr_9[$$idx_B];
        results[count++] = creator(extractedObject);
    }
    return results;
}
$h.Entities._getExtractedStringProperty$i = function $h_Entities$_getExtractedStringProperty$i(data, name, removeDuplicate) {
    var extractedProperties = data[name];
    if (!extractedProperties) {
        return new Array(0);
    }
    if (removeDuplicate) {
        extractedProperties = $h.Entities._removeDuplicate$p(String, extractedProperties, $h.Entities._stringEquals$p, null);
    }
    return extractedProperties;
}
$h.Entities._createContact$p = function $h_Entities$_createContact$p(data) {
    return new $h.Contact(data);
}
$h.Entities._createTaskSuggestion$p = function $h_Entities$_createTaskSuggestion$p(data) {
    return new $h.TaskSuggestion(data);
}
$h.Entities._createPhoneNumber$p = function $h_Entities$_createPhoneNumber$p(data) {
    return new $h.PhoneNumber(data);
}
$h.Entities._entityDictionaryEquals$p = function $h_Entities$_entityDictionaryEquals$p(dictionary1, dictionary2, entityPropertyIdentifier) {
    if (dictionary1 === dictionary2) {
        return true;
    }
    if (!dictionary1 || !dictionary2) {
        return false;
    }
    if (dictionary1[entityPropertyIdentifier] === dictionary2[entityPropertyIdentifier]) {
        return true;
    }
    return false;
}
$h.Entities._stringEquals$p = function $h_Entities$_stringEquals$p(string1, string2, entityProperty) {
    return string1 === string2;
}
$h.Entities._removeDuplicate$p = function $h_Entities$_removeDuplicate$p(T, array, entityEquals, entityPropertyIdentifier) {
    for (var matchIndex1 = array.length - 1; matchIndex1 >= 0; matchIndex1--) {
        var removeMatch = false;
        for (var matchIndex2 = matchIndex1 - 1; matchIndex2 >= 0; matchIndex2--) {
            if (entityEquals(array[matchIndex1], array[matchIndex2], entityPropertyIdentifier)) {
                removeMatch = true;
                break;
            }
        }
        if (removeMatch) {
            Array.removeAt(array, matchIndex1);
        }
    }
    return array;
}
$h.Entities.prototype = {
    _dateTimeSent$p$0: null,
    _data$p$0: null,
    _filteredData$p$0: null,
    _filteredEntitiesCache$p$0: null,
    _permissionLevel$p$0: 0,
    _taskSuggestions$p$0: null,
    _meetingSuggestions$p$0: null,
    _phoneNumbers$p$0: null,
    _contacts$p$0: null,
    _addresses$p$0: null,
    _emailAddresses$p$0: null,
    _urls$p$0: null,
    
    _getByType$i$0: function $h_Entities$_getByType$i$0(entityType) {
        if (entityType === Microsoft.Office.WebExtension.MailboxEnums.EntityType.MeetingSuggestion) {
            return this._getMeetingSuggestions$p$0();
        }
        else if (entityType === Microsoft.Office.WebExtension.MailboxEnums.EntityType.TaskSuggestion) {
            return this._getTaskSuggestions$p$0();
        }
        else if (entityType === Microsoft.Office.WebExtension.MailboxEnums.EntityType.Address) {
            return this._getAddresses$p$0();
        }
        else if (entityType === Microsoft.Office.WebExtension.MailboxEnums.EntityType.PhoneNumber) {
            return this._getPhoneNumbers$p$0();
        }
        else if (entityType === Microsoft.Office.WebExtension.MailboxEnums.EntityType.EmailAddress) {
            return this._getEmailAddresses$p$0();
        }
        else if (entityType === Microsoft.Office.WebExtension.MailboxEnums.EntityType.Url) {
            return this._getUrls$p$0();
        }
        else if (entityType === Microsoft.Office.WebExtension.MailboxEnums.EntityType.Contact) {
            return this._getContacts$p$0();
        }
        return null;
    },
    
    _getFilteredEntitiesByName$i$0: function $h_Entities$_getFilteredEntitiesByName$i$0(name) {
        if (!this._filteredEntitiesCache$p$0) {
            this._filteredEntitiesCache$p$0 = {};
        }
        if (!$h.ScriptHelpers.dictionaryContainsKey(this._filteredEntitiesCache$p$0, name)) {
            var found = false;
            for (var i = 0; i < $h.Entities._allEntityKeys$p.length; i++) {
                var entityTypeKey = $h.Entities._allEntityKeys$p[i];
                var perEntityTypeDictionary = this._filteredData$p$0[entityTypeKey];
                if (!perEntityTypeDictionary) {
                    continue;
                }
                if ($h.ScriptHelpers.dictionaryContainsKey(perEntityTypeDictionary, name)) {
                    switch (entityTypeKey) {
                        case 'EmailAddresses':
                        case 'Urls':
                            this._filteredEntitiesCache$p$0[name] = $h.Entities._getExtractedStringProperty$i(perEntityTypeDictionary, name);
                            break;
                        case 'Addresses':
                            this._filteredEntitiesCache$p$0[name] = $h.Entities._getExtractedStringProperty$i(perEntityTypeDictionary, name, true);
                            break;
                        case 'PhoneNumbers':
                            this._filteredEntitiesCache$p$0[name] = $h.Entities._getExtractedObjects$i($h.PhoneNumber, perEntityTypeDictionary, name, $h.Entities._createPhoneNumber$p, false, null);
                            break;
                        case 'TaskSuggestions':
                            this._filteredEntitiesCache$p$0[name] = $h.Entities._getExtractedObjects$i($h.TaskSuggestion, perEntityTypeDictionary, name, $h.Entities._createTaskSuggestion$p, true, 'TaskString');
                            break;
                        case 'MeetingSuggestions':
                            this._filteredEntitiesCache$p$0[name] = $h.Entities._getExtractedObjects$i($h.MeetingSuggestion, perEntityTypeDictionary, name, this.$$d__createMeetingSuggestion$p$0, true, 'MeetingString');
                            break;
                        case 'Contacts':
                            this._filteredEntitiesCache$p$0[name] = $h.Entities._getExtractedObjects$i($h.Contact, perEntityTypeDictionary, name, $h.Entities._createContact$p, true, 'ContactString');
                            break;
                    }
                    found = true;
                    break;
                }
            }
            if (!found) {
                this._filteredEntitiesCache$p$0[name] = null;
            }
        }
        return this._filteredEntitiesCache$p$0[name];
    },
    
    _createMeetingSuggestion$p$0: function $h_Entities$_createMeetingSuggestion$p$0(data) {
        return new $h.MeetingSuggestion(data, this._dateTimeSent$p$0);
    },
    
    _getAddresses$p$0: function $h_Entities$_getAddresses$p$0() {
        if (!this._addresses$p$0) {
            this._addresses$p$0 = $h.Entities._getExtractedStringProperty$i(this._data$p$0, 'Addresses', true);
        }
        return this._addresses$p$0;
    },
    
    _getEmailAddresses$p$0: function $h_Entities$_getEmailAddresses$p$0() {
        OSF.DDA.OutlookAppOm._throwOnPropertyAccessForRestrictedPermission$i(this._permissionLevel$p$0);
        if (!this._emailAddresses$p$0) {
            this._emailAddresses$p$0 = $h.Entities._getExtractedStringProperty$i(this._data$p$0, 'EmailAddresses', false);
        }
        return this._emailAddresses$p$0;
    },
    
    _getUrls$p$0: function $h_Entities$_getUrls$p$0() {
        if (!this._urls$p$0) {
            this._urls$p$0 = $h.Entities._getExtractedStringProperty$i(this._data$p$0, 'Urls', false);
        }
        return this._urls$p$0;
    },
    
    _getPhoneNumbers$p$0: function $h_Entities$_getPhoneNumbers$p$0() {
        if (!this._phoneNumbers$p$0) {
            this._phoneNumbers$p$0 = $h.Entities._getExtractedObjects$i($h.PhoneNumber, this._data$p$0, 'PhoneNumbers', $h.Entities._createPhoneNumber$p);
        }
        return this._phoneNumbers$p$0;
    },
    
    _getTaskSuggestions$p$0: function $h_Entities$_getTaskSuggestions$p$0() {
        OSF.DDA.OutlookAppOm._throwOnPropertyAccessForRestrictedPermission$i(this._permissionLevel$p$0);
        if (!this._taskSuggestions$p$0) {
            this._taskSuggestions$p$0 = $h.Entities._getExtractedObjects$i($h.TaskSuggestion, this._data$p$0, 'TaskSuggestions', $h.Entities._createTaskSuggestion$p, true, 'TaskString');
        }
        return this._taskSuggestions$p$0;
    },
    
    _getMeetingSuggestions$p$0: function $h_Entities$_getMeetingSuggestions$p$0() {
        OSF.DDA.OutlookAppOm._throwOnPropertyAccessForRestrictedPermission$i(this._permissionLevel$p$0);
        if (!this._meetingSuggestions$p$0) {
            this._meetingSuggestions$p$0 = $h.Entities._getExtractedObjects$i($h.MeetingSuggestion, this._data$p$0, 'MeetingSuggestions', this.$$d__createMeetingSuggestion$p$0, true, 'MeetingString');
        }
        return this._meetingSuggestions$p$0;
    },
    
    _getContacts$p$0: function $h_Entities$_getContacts$p$0() {
        OSF.DDA.OutlookAppOm._throwOnPropertyAccessForRestrictedPermission$i(this._permissionLevel$p$0);
        if (!this._contacts$p$0) {
            this._contacts$p$0 = $h.Entities._getExtractedObjects$i($h.Contact, this._data$p$0, 'Contacts', $h.Entities._createContact$p, true, 'ContactString');
        }
        return this._contacts$p$0;
    }
}






$h.Item = function $h_Item(data) {
    this.$$d__createCustomProperties$i$0 = Function.createDelegate(this, this._createCustomProperties$i$0);
    this.$$d__getAttachments$p$0 = Function.createDelegate(this, this._getAttachments$p$0);
    this.$$d__getItemClass$p$0 = Function.createDelegate(this, this._getItemClass$p$0);
    this.$$d__getItemId$p$0 = Function.createDelegate(this, this._getItemId$p$0);
    this.$$d__getDateTimeModified$p$0 = Function.createDelegate(this, this._getDateTimeModified$p$0);
    this.$$d__getDateTimeCreated$p$0 = Function.createDelegate(this, this._getDateTimeCreated$p$0);
    this._data$p$0 = data;
    $h.InitialData._defineReadOnlyProperty$i(this, 'dateTimeCreated', this.$$d__getDateTimeCreated$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'dateTimeModified', this.$$d__getDateTimeModified$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'itemId', this.$$d__getItemId$p$0);
    var $$t_1 = this;
    $h.InitialData._defineReadOnlyProperty$i(this, 'itemType', function() {
        return $$t_1.getItemType();
    });
    $h.InitialData._defineReadOnlyProperty$i(this, 'itemClass', this.$$d__getItemClass$p$0);
    if (OSF.DDA.OutlookAppOm._instance$p.get__appName$i$0() === 64) {
        $h.InitialData._defineReadOnlyProperty$i(this, 'attachments', this.$$d__getAttachments$p$0);
    }
}
$h.Item.prototype = {
    _data$p$0: null,
    
    loadCustomPropertiesAsync: function $h_Item$loadCustomPropertiesAsync(callback, userContext) {
        if ($h.ScriptHelpers.isNullOrUndefined(callback)) {
            throw Error.argumentNull('callback');
        }
        var loadCustomProperties = new $h._loadDictionaryRequest(this.$$d__createCustomProperties$i$0, 'customProperties', callback, userContext);
        loadCustomProperties._sendRequest$i$0(3, 'LoadCustomProperties', {});
    },
    
    _createCustomProperties$i$0: function $h_Item$_createCustomProperties$i$0(data) {
        return new $h.CustomProperties(data);
    },
    
    _getItemId$p$0: function $h_Item$_getItemId$p$0() {
        return this._data$p$0.get__itemId$i$0();
    },
    
    _getItemClass$p$0: function $h_Item$_getItemClass$p$0() {
        return this._data$p$0.get__itemClass$i$0();
    },
    
    _getDateTimeCreated$p$0: function $h_Item$_getDateTimeCreated$p$0() {
        return this._data$p$0.get__dateTimeCreated$i$0();
    },
    
    _getDateTimeModified$p$0: function $h_Item$_getDateTimeModified$p$0() {
        return this._data$p$0.get__dateTimeModified$i$0();
    },
    
    _getAttachments$p$0: function $h_Item$_getAttachments$p$0() {
        return this._data$p$0.get__attachments$i$0();
    }
}




$h.MeetingRequest = function $h_MeetingRequest(data) {
    this.$$d__getRequiredAttendees$p$2 = Function.createDelegate(this, this._getRequiredAttendees$p$2);
    this.$$d__getOptionalAttendees$p$2 = Function.createDelegate(this, this._getOptionalAttendees$p$2);
    this.$$d__getLocation$p$2 = Function.createDelegate(this, this._getLocation$p$2);
    this.$$d__getEnd$p$2 = Function.createDelegate(this, this._getEnd$p$2);
    this.$$d__getStart$p$2 = Function.createDelegate(this, this._getStart$p$2);
    $h.MeetingRequest.initializeBase(this, [ data ]);
    $h.InitialData._defineReadOnlyProperty$i(this, 'start', this.$$d__getStart$p$2);
    $h.InitialData._defineReadOnlyProperty$i(this, 'end', this.$$d__getEnd$p$2);
    $h.InitialData._defineReadOnlyProperty$i(this, 'location', this.$$d__getLocation$p$2);
    $h.InitialData._defineReadOnlyProperty$i(this, 'optionalAttendees', this.$$d__getOptionalAttendees$p$2);
    $h.InitialData._defineReadOnlyProperty$i(this, 'requiredAttendees', this.$$d__getRequiredAttendees$p$2);
}
$h.MeetingRequest.prototype = {
    
    _getStart$p$2: function $h_MeetingRequest$_getStart$p$2() {
        return this._data$p$0.get__start$i$0();
    },
    
    _getEnd$p$2: function $h_MeetingRequest$_getEnd$p$2() {
        return this._data$p$0.get__end$i$0();
    },
    
    _getLocation$p$2: function $h_MeetingRequest$_getLocation$p$2() {
        return this._data$p$0.get__location$i$0();
    },
    
    _getOptionalAttendees$p$2: function $h_MeetingRequest$_getOptionalAttendees$p$2() {
        return this._data$p$0.get__cc$i$0();
    },
    
    _getRequiredAttendees$p$2: function $h_MeetingRequest$_getRequiredAttendees$p$2() {
        return this._data$p$0.get__to$i$0();
    }
}


$h.MeetingSuggestion = function $h_MeetingSuggestion(data, dateTimeSent) {
    this.$$d__getEndTime$p$0 = Function.createDelegate(this, this._getEndTime$p$0);
    this.$$d__getStartTime$p$0 = Function.createDelegate(this, this._getStartTime$p$0);
    this.$$d__getSubject$p$0 = Function.createDelegate(this, this._getSubject$p$0);
    this.$$d__getLocation$p$0 = Function.createDelegate(this, this._getLocation$p$0);
    this.$$d__getAttendees$p$0 = Function.createDelegate(this, this._getAttendees$p$0);
    this.$$d__getMeetingString$p$0 = Function.createDelegate(this, this._getMeetingString$p$0);
    this._data$p$0 = data;
    this._dateTimeSent$p$0 = dateTimeSent;
    $h.InitialData._defineReadOnlyProperty$i(this, 'meetingString', this.$$d__getMeetingString$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'attendees', this.$$d__getAttendees$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'location', this.$$d__getLocation$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'subject', this.$$d__getSubject$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'start', this.$$d__getStartTime$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'end', this.$$d__getEndTime$p$0);
}
$h.MeetingSuggestion.prototype = {
    _dateTimeSent$p$0: null,
    _data$p$0: null,
    _attendees$p$0: null,
    
    _getMeetingString$p$0: function $h_MeetingSuggestion$_getMeetingString$p$0() {
        return this._data$p$0['MeetingString'];
    },
    
    _getLocation$p$0: function $h_MeetingSuggestion$_getLocation$p$0() {
        return this._data$p$0['Location'];
    },
    
    _getSubject$p$0: function $h_MeetingSuggestion$_getSubject$p$0() {
        return this._data$p$0['Subject'];
    },
    
    _getStartTime$p$0: function $h_MeetingSuggestion$_getStartTime$p$0() {
        var time = this._createDateTimeFromParameter$p$0('StartTime');
        var resolvedTime = $h.MeetingSuggestionTimeDecoder.resolve(time, this._dateTimeSent$p$0);
        if (resolvedTime.getTime() !== time.getTime()) {
            return OSF.DDA.OutlookAppOm._instance$p.convertToUtcClientTime(OSF.DDA.OutlookAppOm._instance$p._dateToDictionary$i$0(resolvedTime));
        }
        return time;
    },
    
    _getEndTime$p$0: function $h_MeetingSuggestion$_getEndTime$p$0() {
        var time = this._createDateTimeFromParameter$p$0('EndTime');
        var resolvedTime = $h.MeetingSuggestionTimeDecoder.resolve(time, this._dateTimeSent$p$0);
        if (resolvedTime.getTime() !== time.getTime()) {
            return OSF.DDA.OutlookAppOm._instance$p.convertToUtcClientTime(OSF.DDA.OutlookAppOm._instance$p._dateToDictionary$i$0(resolvedTime));
        }
        return time;
    },
    
    _createDateTimeFromParameter$p$0: function $h_MeetingSuggestion$_createDateTimeFromParameter$p$0(keyName) {
        var dateTimeString = this._data$p$0[keyName];
        if (!dateTimeString) {
            return null;
        }
        return new Date(dateTimeString);
    },
    
    _getAttendees$p$0: function $h_MeetingSuggestion$_getAttendees$p$0() {
        if (!this._attendees$p$0) {
            var $$t_1 = this;
            this._attendees$p$0 = $h.Entities._getExtractedObjects$i($h.EmailAddressDetails, this._data$p$0, 'Attendees', function(data) {
                return $h.EmailAddressDetails._createFromEmailUserDictionary$i(data);
            });
        }
        return this._attendees$p$0;
    }
}


$h.MeetingSuggestionTimeDecoder = function $h_MeetingSuggestionTimeDecoder() {
}
$h.MeetingSuggestionTimeDecoder.resolve = function $h_MeetingSuggestionTimeDecoder$resolve(inTime, sentTime) {
    if (!sentTime) {
        return inTime;
    }
    try {
        var tod;
        var outDate;
        var extractedDate;
        var sentDate = new Date(sentTime.getFullYear(), sentTime.getMonth(), sentTime.getDate(), 0, 0, 0, 0);
        var $$t_7, $$t_8, $$t_9;
        if (!(($$t_9 = $h.MeetingSuggestionTimeDecoder._decode$p(inTime, ($$t_7 = {'val': extractedDate}), ($$t_8 = {'val': tod}))), extractedDate = $$t_7.val, tod = $$t_8.val, $$t_9)) {
            return inTime;
        }
        else {
            if ($h._preciseDate.isInstanceOfType(extractedDate)) {
                outDate = $h.MeetingSuggestionTimeDecoder._resolvePreciseDate$p(sentDate, extractedDate);
            }
            else {
                if ($h._relativeDate.isInstanceOfType(extractedDate)) {
                    outDate = $h.MeetingSuggestionTimeDecoder._resolveRelativeDate$p(sentDate, extractedDate);
                }
                else {
                    outDate = sentDate;
                }
            }
            if (isNaN(outDate.getTime())) {
                return sentTime;
            }
            outDate.setMilliseconds(outDate.getMilliseconds() + tod);
            return outDate;
        }
    }
    catch ($$e_6) {
        return sentTime;
    }
}
$h.MeetingSuggestionTimeDecoder._isNullOrUndefined$i = function $h_MeetingSuggestionTimeDecoder$_isNullOrUndefined$i(value) {
    return null === value || value === undefined;
}
$h.MeetingSuggestionTimeDecoder._resolvePreciseDate$p = function $h_MeetingSuggestionTimeDecoder$_resolvePreciseDate$p(sentDate, precise) {
    var year = precise._year$i$1;
    var month = (!precise._month$i$1) ? sentDate.getMonth() : precise._month$i$1 - 1;
    var day = precise._day$i$1;
    if (!day) {
        return sentDate;
    }
    var candidate;
    if ($h.MeetingSuggestionTimeDecoder._isNullOrUndefined$i(year)) {
        candidate = new Date(sentDate.getFullYear(), month, day);
        if (candidate.getTime() < sentDate.getTime()) {
            candidate = new Date(sentDate.getFullYear() + 1, month, day);
        }
    }
    else {
        candidate = new Date((year < 50) ? 2000 + year : 1900 + year, month, day);
    }
    if (candidate.getMonth() !== month) {
        return sentDate;
    }
    return candidate;
}
$h.MeetingSuggestionTimeDecoder._resolveRelativeDate$p = function $h_MeetingSuggestionTimeDecoder$_resolveRelativeDate$p(sentDate, relative) {
    var date;
    switch (relative._unit$i$1) {
        case 0:
            date = new Date(sentDate.getFullYear(), sentDate.getMonth(), sentDate.getDate());
            date.setDate(date.getDate() + relative._offset$i$1);
            return date;
        case 5:
            return $h.MeetingSuggestionTimeDecoder._findBestDateForWeekDate$p(sentDate, relative._offset$i$1, relative._tag$i$1);
        case 2:
            var days = 1;
            switch (relative._modifier$i$1) {
                case 1:
                    break;
                case 2:
                    days = 16;
                    break;
                default:
                    if (!relative._offset$i$1) {
                        days = sentDate.getDate();
                    }
                    break;
            }
            date = new Date(sentDate.getFullYear(), sentDate.getMonth(), days);
            date.setMonth(date.getMonth() + relative._offset$i$1);
            if (date.getTime() < sentDate.getTime()) {
                date.setDate(date.getDate() + sentDate.getDate() - 1);
            }
            return date;
        case 1:
            date = new Date(sentDate.getFullYear(), sentDate.getMonth(), sentDate.getDate());
            date.setDate(sentDate.getDate() + (7 * relative._offset$i$1));
            if (relative._modifier$i$1 === 1 || !relative._modifier$i$1) {
                date.setDate(date.getDate() + 1 - date.getDay());
                if (date.getTime() < sentDate.getTime()) {
                    return sentDate;
                }
                return date;
            }
            else if (relative._modifier$i$1 === 2) {
                date.setDate(date.getDate() + 5 - date.getDay());
                return date;
            }
            break;
        case 4:
            return $h.MeetingSuggestionTimeDecoder._findBestDateForWeekOfMonthDate$p(sentDate, relative);
        case 3:
            if (relative._offset$i$1 > 0) {
                return new Date(sentDate.getFullYear() + relative._offset$i$1, 0, 1);
            }
            break;
        default:
            break;
    }
    return sentDate;
}
$h.MeetingSuggestionTimeDecoder._findBestDateForWeekDate$p = function $h_MeetingSuggestionTimeDecoder$_findBestDateForWeekDate$p(sentDate, offset, tag) {
    if (offset > -5 && offset < 5) {
        var dayOfWeek;
        var days;
        dayOfWeek = ((tag + 6) % 7) + 1;
        days = (7 * offset) + (dayOfWeek - sentDate.getDay());
        sentDate.setDate(sentDate.getDate() + days);
        return sentDate;
    }
    else {
        var days = (tag - sentDate.getDay()) % 7;
        if (days < 0) {
            days += 7;
        }
        sentDate.setDate(sentDate.getDate() + days);
        return sentDate;
    }
}
$h.MeetingSuggestionTimeDecoder._findBestDateForWeekOfMonthDate$p = function $h_MeetingSuggestionTimeDecoder$_findBestDateForWeekOfMonthDate$p(sentDate, relative) {
    var date;
    var firstDay;
    var newDate;
    date = sentDate;
    if (relative._tag$i$1 <= 0 || relative._tag$i$1 > 12 || relative._offset$i$1 <= 0 || relative._offset$i$1 > 5) {
        return sentDate;
    }
    var monthOffset = (12 + relative._tag$i$1 - date.getMonth() - 1) % 12;
    firstDay = new Date(date.getFullYear(), date.getMonth() + monthOffset, 1);
    if (relative._modifier$i$1 === 1) {
        if (relative._offset$i$1 === 1 && firstDay.getDay() !== 6 && firstDay.getDay() !== 0) {
            return firstDay;
        }
        else {
            newDate = new Date(firstDay.getFullYear(), firstDay.getMonth(), firstDay.getDate());
            newDate.setDate(newDate.getDate() + ((7 + (1 - firstDay.getDay())) % 7));
            if (firstDay.getDay() !== 6 && firstDay.getDay() !== 0 && firstDay.getDay() !== 1) {
                newDate.setDate(newDate.getDate() - 7);
            }
            newDate.setDate(newDate.getDate() + (7 * (relative._offset$i$1 - 1)));
            if (newDate.getMonth() + 1 !== relative._tag$i$1) {
                return sentDate;
            }
            return newDate;
        }
    }
    else {
        newDate = new Date(firstDay.getFullYear(), firstDay.getMonth(), $h.MeetingSuggestionTimeDecoder._daysInMonth$p(firstDay.getMonth(), firstDay.getFullYear()));
        var offset = 1 - newDate.getDay();
        if (offset > 0) {
            offset = offset - 7;
        }
        newDate.setDate(newDate.getDate() + offset);
        newDate.setDate(newDate.getDate() + (7 * (1 - relative._offset$i$1)));
        if (newDate.getMonth() + 1 !== relative._tag$i$1) {
            if (firstDay.getDay() !== 6 && firstDay.getDay() !== 0) {
                return firstDay;
            }
            else {
                return sentDate;
            }
        }
        else {
            return newDate;
        }
    }
}
$h.MeetingSuggestionTimeDecoder._decode$p = function $h_MeetingSuggestionTimeDecoder$_decode$p(inDate, date, time) {
    var DateValueMask = 32767;
    date.val = null;
    time.val = 0;
    if (!inDate) {
        return false;
    }
    time.val = $h.MeetingSuggestionTimeDecoder._getTimeOfDayInMillisecondsUTC$p(inDate);
    var inDateAtMidnight = inDate.getTime() - time.val;
    var value = (inDateAtMidnight - $h.MeetingSuggestionTimeDecoder._baseDate$p.getTime()) / 86400000;
    if (value < 0) {
        return false;
    }
    else if (value >= 262144) {
        return false;
    }
    else {
        var type = value >> 15;
        value = value & DateValueMask;
        switch (type) {
            case 0:
                return $h.MeetingSuggestionTimeDecoder._decodePreciseDate$p(value, date);
            case 1:
                return $h.MeetingSuggestionTimeDecoder._decodeRelativeDate$p(value, date);
            default:
                return false;
        }
    }
}
$h.MeetingSuggestionTimeDecoder._decodePreciseDate$p = function $h_MeetingSuggestionTimeDecoder$_decodePreciseDate$p(value, date) {
    var c_SubTypeMask = 7;
    var c_MonthMask = 15;
    var c_DayMask = 31;
    var c_YearMask = 127;
    var year = null;
    var month = 0;
    var day = 0;
    date.val = null;
    var subType = (value >> 12) & c_SubTypeMask;
    if ((subType & 4) === 4) {
        year = (value >> 5) & c_YearMask;
        if ((subType & 2) === 2) {
            if ((subType & 1) === 1) {
                return false;
            }
            month = (value >> 1) & c_MonthMask;
        }
    }
    else {
        if ((subType & 2) === 2) {
            month = (value >> 8) & c_MonthMask;
        }
        if ((subType & 1) === 1) {
            day = (value >> 3) & c_DayMask;
        }
    }
    date.val = new $h._preciseDate(day, month, year);
    return true;
}
$h.MeetingSuggestionTimeDecoder._decodeRelativeDate$p = function $h_MeetingSuggestionTimeDecoder$_decodeRelativeDate$p(value, date) {
    var TagMask = 15;
    var OffsetMask = 63;
    var UnitMask = 7;
    var ModifierMask = 3;
    var tag = value & TagMask;
    value >>= 4;
    var offset = $h.MeetingSuggestionTimeDecoder._fromComplement$p(value & OffsetMask, 6);
    value >>= 6;
    var unit = value & UnitMask;
    value >>= 3;
    var modifier = value & ModifierMask;
    try {
        date.val = new $h._relativeDate(modifier, offset, unit, tag);
        return true;
    }
    catch ($$e_A) {
        date.val = null;
        return false;
    }
}
$h.MeetingSuggestionTimeDecoder._fromComplement$p = function $h_MeetingSuggestionTimeDecoder$_fromComplement$p(value, n) {
    var signed = 1 << (n - 1);
    var mask = (1 << n) - 1;
    if ((value & signed) === signed) {
        return -((value ^ mask) + 1);
    }
    else {
        return value;
    }
}
$h.MeetingSuggestionTimeDecoder._daysInMonth$p = function $h_MeetingSuggestionTimeDecoder$_daysInMonth$p(month, year) {
    return 32 - new Date(year, month, 32).getDate();
}
$h.MeetingSuggestionTimeDecoder._getTimeOfDayInMillisecondsUTC$p = function $h_MeetingSuggestionTimeDecoder$_getTimeOfDayInMillisecondsUTC$p(inputTime) {
    var timeOfDay = 0;
    timeOfDay += inputTime.getUTCHours() * 3600;
    timeOfDay += inputTime.getUTCMinutes() * 60;
    timeOfDay += inputTime.getUTCSeconds();
    timeOfDay *= 1000;
    timeOfDay += inputTime.getUTCMilliseconds();
    return timeOfDay;
}


$h._extractedDate = function $h__extractedDate() {
}


$h._preciseDate = function $h__preciseDate(day, month, year) {
    $h._preciseDate.initializeBase(this);
    if (day < 0 || day > 31) {
        throw Error.argumentOutOfRange('day');
    }
    if (month < 0 || month > 12) {
        throw Error.argumentOutOfRange('month');
    }
    this._day$i$1 = day;
    this._month$i$1 = month;
    if (!$h.MeetingSuggestionTimeDecoder._isNullOrUndefined$i(year)) {
        if (!month && day) {
            throw Error.argument('Invalid arguments');
        }
        if (year < 0 || year > 2099) {
            throw Error.argumentOutOfRange('year');
        }
        this._year$i$1 = year % 100;
    }
    else if (!this._month$i$1 && !this._day$i$1) {
        throw Error.argument('Invalid datetime');
    }
}
$h._preciseDate.prototype = {
    _day$i$1: 0,
    _month$i$1: 0,
    _year$i$1: null
}


$h._relativeDate = function $h__relativeDate(modifier, offset, unit, tag) {
    $h._relativeDate.initializeBase(this);
    if (offset < -32 || offset > 31) {
        throw Error.argumentOutOfRange('offset');
    }
    if (tag < 0 || tag > 15) {
        throw Error.argumentOutOfRange('tag');
    }
    if (!unit && offset < 0) {
        throw Error.argument('unit & offset do not form a valid date');
    }
    this._modifier$i$1 = modifier;
    this._offset$i$1 = offset;
    this._unit$i$1 = unit;
    this._tag$i$1 = tag;
}
$h._relativeDate.prototype = {
    _modifier$i$1: 0,
    _offset$i$1: 0,
    _unit$i$1: 0,
    _tag$i$1: 0
}


$h.Message = function $h_Message(dataDictionary) {
    this.$$d__getConversationId$p$1 = Function.createDelegate(this, this._getConversationId$p$1);
    this.$$d__getInternetMessageId$p$1 = Function.createDelegate(this, this._getInternetMessageId$p$1);
    this.$$d__getCc$p$1 = Function.createDelegate(this, this._getCc$p$1);
    this.$$d__getTo$p$1 = Function.createDelegate(this, this._getTo$p$1);
    this.$$d__getFrom$p$1 = Function.createDelegate(this, this._getFrom$p$1);
    this.$$d__getSender$p$1 = Function.createDelegate(this, this._getSender$p$1);
    this.$$d__getNormalizedSubject$p$1 = Function.createDelegate(this, this._getNormalizedSubject$p$1);
    this.$$d__getSubject$p$1 = Function.createDelegate(this, this._getSubject$p$1);
    $h.Message.initializeBase(this, [ dataDictionary ]);
    $h.InitialData._defineReadOnlyProperty$i(this, 'subject', this.$$d__getSubject$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'normalizedSubject', this.$$d__getNormalizedSubject$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'sender', this.$$d__getSender$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'from', this.$$d__getFrom$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'to', this.$$d__getTo$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'cc', this.$$d__getCc$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'internetMessageId', this.$$d__getInternetMessageId$p$1);
    $h.InitialData._defineReadOnlyProperty$i(this, 'conversationId', this.$$d__getConversationId$p$1);
}
$h.Message.prototype = {
    
    getEntities: function $h_Message$getEntities() {
        return this._data$p$0._getEntities$i$0();
    },
    
    getEntitiesByType: function $h_Message$getEntitiesByType(entityType) {
        return this._data$p$0._getEntitiesByType$i$0(entityType);
    },
    
    getFilteredEntitiesByName: function $h_Message$getFilteredEntitiesByName(name) {
        return this._data$p$0._getFilteredEntitiesByName$i$0(name);
    },
    
    getRegExMatches: function $h_Message$getRegExMatches() {
        OSF.DDA.OutlookAppOm._throwOnMethodCallForInsufficientPermission$i(this._data$p$0.get__permissionLevel$i$0(), 1, 'getRegExMatches');
        return this._data$p$0._getRegExMatches$i$0();
    },
    
    getRegExMatchesByName: function $h_Message$getRegExMatchesByName(name) {
        OSF.DDA.OutlookAppOm._throwOnMethodCallForInsufficientPermission$i(this._data$p$0.get__permissionLevel$i$0(), 1, 'getRegExMatchesByName');
        return this._data$p$0._getRegExMatchesByName$i$0(name);
    },
    
    displayReplyForm: function $h_Message$displayReplyForm(htmlBody) {
        OSF.DDA.OutlookAppOm._instance$p._displayReplyForm$i$0(htmlBody);
    },
    
    displayReplyAllForm: function $h_Message$displayReplyAllForm(htmlBody) {
        OSF.DDA.OutlookAppOm._instance$p._displayReplyAllForm$i$0(htmlBody);
    },
    
    getItemType: function $h_Message$getItemType() {
        return Microsoft.Office.WebExtension.MailboxEnums.ItemType.Message;
    },
    
    _getSubject$p$1: function $h_Message$_getSubject$p$1() {
        return this._data$p$0.get__subject$i$0();
    },
    
    _getNormalizedSubject$p$1: function $h_Message$_getNormalizedSubject$p$1() {
        return this._data$p$0.get__normalizedSubject$i$0();
    },
    
    _getSender$p$1: function $h_Message$_getSender$p$1() {
        return this._data$p$0.get__sender$i$0();
    },
    
    _getFrom$p$1: function $h_Message$_getFrom$p$1() {
        return this._data$p$0.get__from$i$0();
    },
    
    _getTo$p$1: function $h_Message$_getTo$p$1() {
        return this._data$p$0.get__to$i$0();
    },
    
    _getCc$p$1: function $h_Message$_getCc$p$1() {
        return this._data$p$0.get__cc$i$0();
    },
    
    _getInternetMessageId$p$1: function $h_Message$_getInternetMessageId$p$1() {
        return this._data$p$0.get__internetMessageId$i$0();
    },
    
    _getConversationId$p$1: function $h_Message$_getConversationId$p$1() {
        return this._data$p$0.get__conversationId$i$0();
    }
}


$h.PhoneNumber = function $h_PhoneNumber(data) {
    this.$$d__getPhoneType$p$0 = Function.createDelegate(this, this._getPhoneType$p$0);
    this.$$d__getOriginalPhoneString$p$0 = Function.createDelegate(this, this._getOriginalPhoneString$p$0);
    this.$$d__getPhoneString$p$0 = Function.createDelegate(this, this._getPhoneString$p$0);
    this._data$p$0 = data;
    $h.InitialData._defineReadOnlyProperty$i(this, 'phoneString', this.$$d__getPhoneString$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'originalPhoneString', this.$$d__getOriginalPhoneString$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'type', this.$$d__getPhoneType$p$0);
}
$h.PhoneNumber.prototype = {
    _data$p$0: null,
    
    _getPhoneString$p$0: function $h_PhoneNumber$_getPhoneString$p$0() {
        return this._data$p$0['PhoneString'];
    },
    
    _getOriginalPhoneString$p$0: function $h_PhoneNumber$_getOriginalPhoneString$p$0() {
        return this._data$p$0['OriginalPhoneString'];
    },
    
    _getPhoneType$p$0: function $h_PhoneNumber$_getPhoneType$p$0() {
        return this._data$p$0['Type'];
    }
}


$h.TaskSuggestion = function $h_TaskSuggestion(data) {
    this.$$d__getAssignees$p$0 = Function.createDelegate(this, this._getAssignees$p$0);
    this.$$d__getTaskString$p$0 = Function.createDelegate(this, this._getTaskString$p$0);
    this._data$p$0 = data;
    $h.InitialData._defineReadOnlyProperty$i(this, 'taskString', this.$$d__getTaskString$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'assignees', this.$$d__getAssignees$p$0);
}
$h.TaskSuggestion.prototype = {
    _data$p$0: null,
    _assignees$p$0: null,
    
    _getTaskString$p$0: function $h_TaskSuggestion$_getTaskString$p$0() {
        return this._data$p$0['TaskString'];
    },
    
    _getAssignees$p$0: function $h_TaskSuggestion$_getAssignees$p$0() {
        if (!this._assignees$p$0) {
            var $$t_1 = this;
            this._assignees$p$0 = $h.Entities._getExtractedObjects$i($h.EmailAddressDetails, this._data$p$0, 'Assignees', function(data) {
                return $h.EmailAddressDetails._createFromEmailUserDictionary$i(data);
            });
        }
        return this._assignees$p$0;
    }
}


$h.UserProfile = function $h_UserProfile(data) {
    this.$$d__getTimeZone$p$0 = Function.createDelegate(this, this._getTimeZone$p$0);
    this.$$d__getEmailAddress$p$0 = Function.createDelegate(this, this._getEmailAddress$p$0);
    this.$$d__getDisplayName$p$0 = Function.createDelegate(this, this._getDisplayName$p$0);
    this._data$p$0 = data;
    $h.InitialData._defineReadOnlyProperty$i(this, 'displayName', this.$$d__getDisplayName$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'emailAddress', this.$$d__getEmailAddress$p$0);
    $h.InitialData._defineReadOnlyProperty$i(this, 'timeZone', this.$$d__getTimeZone$p$0);
}
$h.UserProfile.prototype = {
    _data$p$0: null,
    
    _getDisplayName$p$0: function $h_UserProfile$_getDisplayName$p$0() {
        return this._data$p$0.get__userDisplayName$i$0();
    },
    
    _getEmailAddress$p$0: function $h_UserProfile$_getEmailAddress$p$0() {
        return this._data$p$0.get__userEmailAddress$i$0();
    },
    
    _getTimeZone$p$0: function $h_UserProfile$_getTimeZone$p$0() {
        return this._data$p$0.get__userTimeZone$i$0();
    }
}


$h.RequestState = function() {}
$h.RequestState.prototype = {
    unsent: 0, 
    opened: 1, 
    headersReceived: 2, 
    loading: 3, 
    done: 4
}
$h.RequestState.registerEnum('$h.RequestState', false);


$h.EwsRequest = function $h_EwsRequest(userContext) {
    this.readyState = 1;
    $h.EwsRequest.initializeBase(this, [ userContext ]);
}
$h.EwsRequest.prototype = {
    status: 0,
    statusText: null,
    onreadystatechange: null,
    responseText: null,
    
    get__statusCode$i$1: function $h_EwsRequest$get__statusCode$i$1() {
        return this.status;
    },
    set__statusCode$i$1: function $h_EwsRequest$set__statusCode$i$1(value) {
        this.status = value;
        return value;
    },
    
    get__statusDescription$i$1: function $h_EwsRequest$get__statusDescription$i$1() {
        return this.statusText;
    },
    set__statusDescription$i$1: function $h_EwsRequest$set__statusDescription$i$1(value) {
        this.statusText = value;
        return value;
    },
    
    get__requestState$i$1: function $h_EwsRequest$get__requestState$i$1() {
        return this.readyState;
    },
    set__requestState$i$1: function $h_EwsRequest$set__requestState$i$1(value) {
        this.readyState = value;
        return value;
    },
    
    get__response$i$1: function $h_EwsRequest$get__response$i$1() {
        return this.responseText;
    },
    set__response$i$1: function $h_EwsRequest$set__response$i$1(value) {
        this.responseText = value;
        return value;
    },
    
    send: function $h_EwsRequest$send(data) {
        this._checkSendConditions$i$1();
        if ($h.ScriptHelpers.isNullOrUndefined(data)) {
            this._throwInvalidStateException$i$1();
        }
        this._sendRequest$i$0(5, 'EwsRequest', { body: data });
    },
    
    _callOnReadyStateChangeCallback$i$1: function $h_EwsRequest$_callOnReadyStateChangeCallback$i$1() {
        if (!$h.ScriptHelpers.isNullOrUndefined(this.onreadystatechange)) {
            this.onreadystatechange();
        }
    },
    
    _parseExtraResponseData$i$1: function $h_EwsRequest$_parseExtraResponseData$i$1(response) {
    }
}


$h.InitialData = function $h_InitialData(data) {
    this._data$p$0 = data;
}
$h.InitialData._defineReadOnlyProperty$i = function $h_InitialData$_defineReadOnlyProperty$i(o, methodName, getter) {
    var propertyDescriptor = { get: getter, configurable: false };
    Object.defineProperty(o, methodName, propertyDescriptor);
}
$h.InitialData.prototype = {
    _toRecipients$p$0: null,
    _ccRecipients$p$0: null,
    _attachments$p$0: null,
    _resources$p$0: null,
    _entities$p$0: null,
    _data$p$0: null,
    
    get__permissionLevel$i$0: function $h_InitialData$get__permissionLevel$i$0() {
        var permissionLevel = this._data$p$0['permissionLevel'];
        return (!$h.ScriptHelpers.isUndefined(permissionLevel)) ? permissionLevel : 0;
    },
    
    get__itemId$i$0: function $h_InitialData$get__itemId$i$0() {
        return this._data$p$0['id'];
    },
    
    get__itemClass$i$0: function $h_InitialData$get__itemClass$i$0() {
        return this._data$p$0['itemClass'];
    },
    
    get__dateTimeCreated$i$0: function $h_InitialData$get__dateTimeCreated$i$0() {
        return new Date(this._data$p$0['dateTimeCreated']);
    },
    
    get__dateTimeModified$i$0: function $h_InitialData$get__dateTimeModified$i$0() {
        return new Date(this._data$p$0['dateTimeModified']);
    },
    
    get__dateTimeSent$i$0: function $h_InitialData$get__dateTimeSent$i$0() {
        return new Date(this._data$p$0['dateTimeSent']);
    },
    
    get__subject$i$0: function $h_InitialData$get__subject$i$0() {
        return this._data$p$0['subject'];
    },
    
    get__normalizedSubject$i$0: function $h_InitialData$get__normalizedSubject$i$0() {
        return this._data$p$0['normalizedSubject'];
    },
    
    get__internetMessageId$i$0: function $h_InitialData$get__internetMessageId$i$0() {
        return this._data$p$0['internetMessageId'];
    },
    
    get__conversationId$i$0: function $h_InitialData$get__conversationId$i$0() {
        return this._data$p$0['conversationId'];
    },
    
    get__sender$i$0: function $h_InitialData$get__sender$i$0() {
        this._throwOnRestrictedPermissionLevel$p$0();
        var sender = this._data$p$0['sender'];
        return ($h.ScriptHelpers.isNullOrUndefined(sender)) ? null : new $h.EmailAddressDetails(sender);
    },
    
    get__from$i$0: function $h_InitialData$get__from$i$0() {
        this._throwOnRestrictedPermissionLevel$p$0();
        var from = this._data$p$0['from'];
        return ($h.ScriptHelpers.isNullOrUndefined(from)) ? null : new $h.EmailAddressDetails(from);
    },
    
    get__to$i$0: function $h_InitialData$get__to$i$0() {
        this._throwOnRestrictedPermissionLevel$p$0();
        if (null === this._toRecipients$p$0) {
            this._toRecipients$p$0 = this._createEmailAddressDetails$p$0('to');
        }
        return this._toRecipients$p$0;
    },
    
    get__cc$i$0: function $h_InitialData$get__cc$i$0() {
        this._throwOnRestrictedPermissionLevel$p$0();
        if (null === this._ccRecipients$p$0) {
            this._ccRecipients$p$0 = this._createEmailAddressDetails$p$0('cc');
        }
        return this._ccRecipients$p$0;
    },
    
    get__attachments$i$0: function $h_InitialData$get__attachments$i$0() {
        this._throwOnRestrictedPermissionLevel$p$0();
        if (null === this._attachments$p$0) {
            this._attachments$p$0 = this._createAttachmentDetails$p$0();
        }
        return this._attachments$p$0;
    },
    
    get__ewsUrl$i$0: function $h_InitialData$get__ewsUrl$i$0() {
        return this._data$p$0['ewsUrl'];
    },
    
    get__start$i$0: function $h_InitialData$get__start$i$0() {
        return new Date(this._data$p$0['start']);
    },
    
    get__end$i$0: function $h_InitialData$get__end$i$0() {
        return new Date(this._data$p$0['end']);
    },
    
    get__location$i$0: function $h_InitialData$get__location$i$0() {
        return this._data$p$0['location'];
    },
    
    get__resources$i$0: function $h_InitialData$get__resources$i$0() {
        this._throwOnRestrictedPermissionLevel$p$0();
        if (null === this._resources$p$0) {
            this._resources$p$0 = this._createEmailAddressDetails$p$0('resources');
        }
        return this._resources$p$0;
    },
    
    get__organizer$i$0: function $h_InitialData$get__organizer$i$0() {
        this._throwOnRestrictedPermissionLevel$p$0();
        var organizer = this._data$p$0['organizer'];
        return ($h.ScriptHelpers.isNullOrUndefined(organizer)) ? null : new $h.EmailAddressDetails(organizer);
    },
    
    get__userDisplayName$i$0: function $h_InitialData$get__userDisplayName$i$0() {
        return this._data$p$0['userDisplayName'];
    },
    
    get__userEmailAddress$i$0: function $h_InitialData$get__userEmailAddress$i$0() {
        return this._data$p$0['userEmailAddress'];
    },
    
    get__userTimeZone$i$0: function $h_InitialData$get__userTimeZone$i$0() {
        return this._data$p$0['userTimeZone'];
    },
    
    get__timeZoneOffsets$i$0: function $h_InitialData$get__timeZoneOffsets$i$0() {
        return this._data$p$0['timeZoneOffsets'];
    },
    
    get__hostVersion$i$0: function $h_InitialData$get__hostVersion$i$0() {
        return this._data$p$0['hostVersion'];
    },
    
    get__owaView$i$0: function $h_InitialData$get__owaView$i$0() {
        return this._data$p$0['owaView'];
    },
    
    _getEntities$i$0: function $h_InitialData$_getEntities$i$0() {
        if (!this._entities$p$0) {
            this._entities$p$0 = new $h.Entities(this._data$p$0['entities'], this._data$p$0['filteredEntities'], this.get__dateTimeSent$i$0(), this.get__permissionLevel$i$0());
        }
        return this._entities$p$0;
    },
    
    _getEntitiesByType$i$0: function $h_InitialData$_getEntitiesByType$i$0(entityType) {
        var entites = this._getEntities$i$0();
        return entites._getByType$i$0(entityType);
    },
    
    _getFilteredEntitiesByName$i$0: function $h_InitialData$_getFilteredEntitiesByName$i$0(name) {
        var entities = this._getEntities$i$0();
        return entities._getFilteredEntitiesByName$i$0(name);
    },
    
    _getRegExMatches$i$0: function $h_InitialData$_getRegExMatches$i$0() {
        if (!this._data$p$0['regExMatches']) {
            return null;
        }
        return this._data$p$0['regExMatches'];
    },
    
    _getRegExMatchesByName$i$0: function $h_InitialData$_getRegExMatchesByName$i$0(regexName) {
        var regexMatches = this._getRegExMatches$i$0();
        if (!regexMatches || !regexMatches[regexName]) {
            return null;
        }
        return regexMatches[regexName];
    },
    
    _createEmailAddressDetails$p$0: function $h_InitialData$_createEmailAddressDetails$p$0(key) {
        var to = this._data$p$0[key];
        if ($h.ScriptHelpers.isNullOrUndefined(to)) {
            return [];
        }
        var recipients = [];
        for (var i = 0; i < to.length; i++) {
            if (!$h.ScriptHelpers.isNullOrUndefined(to[i])) {
                recipients[i] = new $h.EmailAddressDetails(to[i]);
            }
        }
        return recipients;
    },
    
    _createAttachmentDetails$p$0: function $h_InitialData$_createAttachmentDetails$p$0() {
        var attachments = this._data$p$0['attachments'];
        if ($h.ScriptHelpers.isNullOrUndefined(attachments)) {
            return [];
        }
        var attachmentDetails = [];
        for (var i = 0; i < attachments.length; i++) {
            if (!$h.ScriptHelpers.isNullOrUndefined(attachments[i])) {
                attachmentDetails[i] = new $h.AttachmentDetails(attachments[i]);
            }
        }
        return attachmentDetails;
    },
    
    _throwOnRestrictedPermissionLevel$p$0: function $h_InitialData$_throwOnRestrictedPermissionLevel$p$0() {
        OSF.DDA.OutlookAppOm._throwOnPropertyAccessForRestrictedPermission$i(this.get__permissionLevel$i$0());
    }
}


$h._loadDictionaryRequest = function $h__loadDictionaryRequest(createResultObject, dictionaryName, callback, userContext) {
    $h._loadDictionaryRequest.initializeBase(this, [ userContext ]);
    this._createResultObject$p$1 = createResultObject;
    this._dictionaryName$p$1 = dictionaryName;
    this._callback$p$1 = callback;
}
$h._loadDictionaryRequest.prototype = {
    _dictionaryName$p$1: null,
    _createResultObject$p$1: null,
    _callback$p$1: null,
    
    handleResponse: function $h__loadDictionaryRequest$handleResponse(response) {
        if (response['wasSuccessful']) {
            var value = response[this._dictionaryName$p$1];
            var responseData = JSON.parse(value);
            this.createAsyncResult(this._createResultObject$p$1(responseData), 0, null);
        }
        else {
            this.createAsyncResult(null, 1, response['errorMessage']);
        }
        this._callback$p$1(this._asyncResult$p$0);
    }
}


$h.ProxyRequestBase = function $h_ProxyRequestBase(userContext) {
    $h.ProxyRequestBase.initializeBase(this, [ userContext ]);
}
$h.ProxyRequestBase.prototype = {
    
    handleResponse: function $h_ProxyRequestBase$handleResponse(response) {
        if (!(response['wasProxySuccessful'])) {
            this.set__statusCode$i$1(500);
            this.set__statusDescription$i$1('Error');
            var errorMessage = response['errorMessage'];
            this.set__response$i$1(errorMessage);
            this.createAsyncResult(null, 1, errorMessage);
        }
        else {
            this.set__statusCode$i$1(response['statusCode']);
            this.set__statusDescription$i$1(response['statusDescription']);
            this.set__response$i$1(response['body']);
            this.createAsyncResult(this.get__response$i$1(), 0, null);
        }
        this._parseExtraResponseData$i$1(response);
        this._cycleReadyStateFromHeadersReceivedToLoadingToDone$i$1();
    },
    
    _throwInvalidStateException$i$1: function $h_ProxyRequestBase$_throwInvalidStateException$i$1() {
        throw Error.create('DOMException', { code: 11, message: 'INVALID_STATE_ERR' });
    },
    
    _cycleReadyStateFromHeadersReceivedToLoadingToDone$i$1: function $h_ProxyRequestBase$_cycleReadyStateFromHeadersReceivedToLoadingToDone$i$1() {
        var $$t_0 = this;
        this._changeReadyState$i$1(2, function() {
            $$t_0._changeReadyState$i$1(3, function() {
                $$t_0._changeReadyState$i$1(4, null);
            });
        });
    },
    
    _changeReadyState$i$1: function $h_ProxyRequestBase$_changeReadyState$i$1(state, nextStep) {
        this.set__requestState$i$1(state);
        var $$t_2 = this;
        window.setTimeout(function() {
            try {
                $$t_2._callOnReadyStateChangeCallback$i$1();
            }
            finally {
                if (!$h.ScriptHelpers.isNullOrUndefined(nextStep)) {
                    nextStep();
                }
            }
        }, 0);
    },
    
    _checkSendConditions$i$1: function $h_ProxyRequestBase$_checkSendConditions$i$1() {
        if (this.get__requestState$i$1() !== 1) {
            this._throwInvalidStateException$i$1();
        }
        if (this._isSent$p$0) {
            this._throwInvalidStateException$i$1();
        }
    }
}


$h.RequestBase = function $h_RequestBase(userContext) {
    this._userContext$p$0 = userContext;
}
$h.RequestBase.prototype = {
    _isSent$p$0: false,
    _asyncResult$p$0: null,
    _userContext$p$0: null,
    
    _sendRequest$i$0: function $h_RequestBase$_sendRequest$i$0(dispid, methodName, dataToSend) {
        this._isSent$p$0 = true;
        var $$t_5 = this;
        OSF.DDA.OutlookAppOm._instance$p._invokeHostMethod$i$0(dispid, methodName, dataToSend, function(resultCode, response) {
            if (resultCode) {
                $$t_5.createAsyncResult(null, 1, String.format(_u.ExtensibilityStrings.l_InternalProtocolError_Text, resultCode));
            }
            else {
                $$t_5.handleResponse(response);
            }
        });
    },
    
    createAsyncResult: function $h_RequestBase$createAsyncResult(value, errorCode, errorDescription) {
        this._asyncResult$p$0 = OSF.DDA.OutlookAppOm._createAsyncResult$i(value, errorCode, errorDescription, this._userContext$p$0);
    }
}


$h._saveDictionaryRequest = function $h__saveDictionaryRequest(callback, userContext) {
    $h._saveDictionaryRequest.initializeBase(this, [ userContext ]);
    if (!$h.ScriptHelpers.isNullOrUndefined(callback)) {
        this._callback$p$1 = callback;
    }
}
$h._saveDictionaryRequest.prototype = {
    _callback$p$1: null,
    
    handleResponse: function $h__saveDictionaryRequest$handleResponse(response) {
        if (response['wasSuccessful']) {
            this.createAsyncResult(null, 0, null);
        }
        else {
            this.createAsyncResult(null, 1, response['errorMessage']);
        }
        if (!$h.ScriptHelpers.isNullOrUndefined(this._callback$p$1)) {
            this._callback$p$1(this._asyncResult$p$0);
        }
    }
}


$h.ScriptHelpers = function $h_ScriptHelpers() {
}
$h.ScriptHelpers.isNull = function $h_ScriptHelpers$isNull(value) {
    return null === value;
}
$h.ScriptHelpers.isNullOrUndefined = function $h_ScriptHelpers$isNullOrUndefined(value) {
    return $h.ScriptHelpers.isNull(value) || $h.ScriptHelpers.isUndefined(value);
}
$h.ScriptHelpers.isUndefined = function $h_ScriptHelpers$isUndefined(value) {
    return value === undefined;
}
$h.ScriptHelpers.dictionaryContainsKey = function $h_ScriptHelpers$dictionaryContainsKey(obj, keyName) {
    return (Object.isInstanceOfType(obj)) ? keyName in obj : false;
}


OSF.DDA.OutlookAppOm.registerClass('OSF.DDA.OutlookAppOm');
OSF.DDA.Settings.registerClass('OSF.DDA.Settings');
$h.Item.registerClass('$h.Item');
$h.Appointment.registerClass('$h.Appointment', $h.Item);
$h.AttachmentDetails.registerClass('$h.AttachmentDetails');
$h.Contact.registerClass('$h.Contact');
$h.CustomProperties.registerClass('$h.CustomProperties');
$h.Diagnostics.registerClass('$h.Diagnostics');
$h.EmailAddressDetails.registerClass('$h.EmailAddressDetails');
$h.Entities.registerClass('$h.Entities');
$h.Message.registerClass('$h.Message', $h.Item);
$h.MeetingRequest.registerClass('$h.MeetingRequest', $h.Message);
$h.MeetingSuggestion.registerClass('$h.MeetingSuggestion');
$h.MeetingSuggestionTimeDecoder.registerClass('$h.MeetingSuggestionTimeDecoder');
$h._extractedDate.registerClass('$h._extractedDate');
$h._preciseDate.registerClass('$h._preciseDate', $h._extractedDate);
$h._relativeDate.registerClass('$h._relativeDate', $h._extractedDate);
$h.PhoneNumber.registerClass('$h.PhoneNumber');
$h.TaskSuggestion.registerClass('$h.TaskSuggestion');
$h.UserProfile.registerClass('$h.UserProfile');
$h.RequestBase.registerClass('$h.RequestBase');
$h.ProxyRequestBase.registerClass('$h.ProxyRequestBase', $h.RequestBase);
$h.EwsRequest.registerClass('$h.EwsRequest', $h.ProxyRequestBase);
$h.InitialData.registerClass('$h.InitialData');
$h._loadDictionaryRequest.registerClass('$h._loadDictionaryRequest', $h.RequestBase);
$h._saveDictionaryRequest.registerClass('$h._saveDictionaryRequest', $h.RequestBase);
$h.ScriptHelpers.registerClass('$h.ScriptHelpers');
OSF.DDA.OutlookAppOm._maxRecipients$p = 100;
OSF.DDA.OutlookAppOm._maxSubjectLength$p = 255;
OSF.DDA.OutlookAppOm._maxBodyLength$p = 32768;
OSF.DDA.OutlookAppOm._maxLocationLength$p = 255;
OSF.DDA.OutlookAppOm._maxEwsRequestSize$p = 1000000;
OSF.DDA.OutlookAppOm._instance$p = null;
$h.AttachmentDetails._attachmentTypeMap$p = [ Microsoft.Office.WebExtension.MailboxEnums.AttachmentType.File, Microsoft.Office.WebExtension.MailboxEnums.AttachmentType.Item ];
$h.Diagnostics.outlookAppName = 'Outlook';
$h.Diagnostics.outlookWebAppName = 'OutlookWebApp';
$h.EmailAddressDetails._emptyString$p = '';
$h.EmailAddressDetails._responseTypeMap$p = [ Microsoft.Office.WebExtension.MailboxEnums.ResponseType.None, Microsoft.Office.WebExtension.MailboxEnums.ResponseType.Organizer, Microsoft.Office.WebExtension.MailboxEnums.ResponseType.Tentative, Microsoft.Office.WebExtension.MailboxEnums.ResponseType.Accepted, Microsoft.Office.WebExtension.MailboxEnums.ResponseType.Declined ];
$h.EmailAddressDetails._recipientTypeMap$p = [ Microsoft.Office.WebExtension.MailboxEnums.RecipientType.Other, Microsoft.Office.WebExtension.MailboxEnums.RecipientType.DistributionList, Microsoft.Office.WebExtension.MailboxEnums.RecipientType.User, Microsoft.Office.WebExtension.MailboxEnums.RecipientType.ExternalUser ];
$h.Entities._allEntityKeys$p = [ 'Addresses', 'EmailAddresses', 'Urls', 'PhoneNumbers', 'TaskSuggestions', 'MeetingSuggestions', 'Contacts' ];
$h.MeetingSuggestionTimeDecoder._baseDate$p = new Date('0001-01-01T00:00:00Z');
$h.ScriptHelpers.emptyString = '';


/* Office rich client common JavaScript API library */
/* Version: 15.0.4469.1000 */
/*
	Copyright (c) Microsoft Corporation.  All rights reserved.
*/

/*
	Your use of this file is governed by the Microsoft Services Agreement http://go.microsoft.com/fwlink/?LinkId=266419.
*/

OSF.ClientMode={
	ReadWrite: 0,
	ReadOnly: 1
}
OSF.DDA.RichInitializationReason={
	1: Microsoft.Office.WebExtension.InitializationReason.Inserted,
	2: Microsoft.Office.WebExtension.InitializationReason.DocumentOpened
};
Microsoft.Office.WebExtension.FileType={
	Text: "text",
	Compressed: "compressed"
};
OSF.DDA.RichClientSettingsManager={
	read: function OSF_DDA_RichClientSettingsManager$Read(onCalling, onReceiving) {
		var keys=[];
		var values=[];
		if (onCalling) {
			onCalling();
		}
		window.external.GetContext().GetSettings().Read(keys, values);
		if (onReceiving) {
			onReceiving();
		}
		var serializedSettings={};
		for (var index=0; index < keys.length; index++) {
			serializedSettings[keys[index]]=values[index];
		}
		return serializedSettings;
	},
	write: function OSF_DDA_RichClientSettingsManager$Write(serializedSettings, overwriteIfStale, onCalling, onReceiving) {
		var keys=[];
		var values=[];
		for (var key in serializedSettings) {
			keys.push(key);
			values.push(serializedSettings[key]);
		}
		if (onCalling) {
			onCalling();
		}
		window.external.GetContext().GetSettings().Write(keys, values);
		if (onReceiving) {
			onReceiving();
		}
	}
};
OSF.DDA.DispIdHost.getRichClientDelegateMethods=function (actionId) {
	var delegateMethods={};
	delegateMethods[OSF.DDA.DispIdHost.Delegates.ExecuteAsync]=OSF.DDA.SafeArray.Delegate.executeAsync;
	delegateMethods[OSF.DDA.DispIdHost.Delegates.RegisterEventAsync]=OSF.DDA.SafeArray.Delegate.registerEventAsync;
	delegateMethods[OSF.DDA.DispIdHost.Delegates.UnregisterEventAsync]=OSF.DDA.SafeArray.Delegate.unregisterEventAsync;
	function getSettingsExecuteMethod(hostDelegateMethod) {
		return function (args) {
			var status, response;
			try {
				response=hostDelegateMethod(args.hostCallArgs, args.onCalling, args.onReceiving);
				status=OSF.DDA.ErrorCodeManager.errorCodes.ooeSuccess;
			} catch (ex) {
				status=OSF.DDA.ErrorCodeManager.errorCodes.ooeInternalError;
				response={ name : Strings.OfficeOM.L_InternalError, message : ex };
			}
			if (args.onComplete) {
				args.onComplete(status, response);
			}
		};
	}
	function readSerializedSettings(hostCallArgs, onCalling, onReceiving) {
		return OSF.DDA.RichClientSettingsManager.read(onCalling, onReceiving);
	}
	function writeSerializedSettings(hostCallArgs, onCalling, onReceiving) {
		return OSF.DDA.RichClientSettingsManager.write(
			hostCallArgs[OSF.DDA.SettingsManager.SerializedSettings],
			hostCallArgs[Microsoft.Office.WebExtension.Parameters.OverwriteIfStale],
			onCalling,
			onReceiving
		);
	}
	switch (actionId) {
		case OSF.DDA.AsyncMethodNames.RefreshAsync.id:
			delegateMethods[OSF.DDA.DispIdHost.Delegates.ExecuteAsync]=getSettingsExecuteMethod(readSerializedSettings);
			break;
		case OSF.DDA.AsyncMethodNames.SaveAsync.id:
			delegateMethods[OSF.DDA.DispIdHost.Delegates.ExecuteAsync]=getSettingsExecuteMethod(writeSerializedSettings);
			break;
		default:
			break;
	}
	return delegateMethods;
}
OSF.DDA.File=function OSF_DDA_File(handle, fileSize, sliceSize) {
	OSF.OUtil.defineEnumerableProperties(this, {
		"size": {
			value: fileSize
		},
		"sliceCount": {
			value: Math.ceil(fileSize / sliceSize)
		}
	});
	var privateState={};
	privateState[OSF.DDA.FileProperties.Handle]=handle;
	privateState[OSF.DDA.FileProperties.SliceSize]=sliceSize;
	var am=OSF.DDA.AsyncMethodNames;
	OSF.DDA.DispIdHost.addAsyncMethods(
		this, [
			am.GetDocumentCopyChunkAsync,
			am.ReleaseDocumentCopyAsync
		],
		privateState
	);
}
OSF.DDA.FileSliceOffset="fileSliceoffset";
OSF.DDA.CustomXmlParts=function OSF_DDA_CustomXmlParts() {
	this._eventDispatches=[];
	var am=OSF.DDA.AsyncMethodNames;
	OSF.DDA.DispIdHost.addAsyncMethods(this, [
		am.AddDataPartAsync,
		am.GetDataPartByIdAsync,
		am.GetDataPartsByNameSpaceAsync
	]);
};
OSF.DDA.CustomXmlPart=function OSF_DDA_CustomXmlPart(customXmlParts, id, builtIn) {
	OSF.OUtil.defineEnumerableProperties(this, {
		"builtIn": {
			value: builtIn
		},
		"id": {
			value: id
		},
		"namespaceManager": {
			value: new OSF.DDA.CustomXmlPrefixMappings(id)
		}
	});
	var am=OSF.DDA.AsyncMethodNames;
	OSF.DDA.DispIdHost.addAsyncMethods(this, [
		am.DeleteDataPartAsync,
		am.GetPartNodesAsync,
		am.GetPartXmlAsync
	]);
	var customXmlPartEventDispatches=customXmlParts._eventDispatches;
	var dispatch=customXmlPartEventDispatches[id];
	if (!dispatch) {
		var et=Microsoft.Office.WebExtension.EventType;
		dispatch=new OSF.EventDispatch([
			et.DataNodeDeleted,
			et.DataNodeInserted,
			et.DataNodeReplaced
		]);
		customXmlPartEventDispatches[id]=dispatch;
	}
	OSF.DDA.DispIdHost.addEventSupport(this, dispatch);
};
OSF.DDA.CustomXmlPrefixMappings=function OSF_DDA_CustomXmlPrefixMappings(partId) {
	var am=OSF.DDA.AsyncMethodNames;
	OSF.DDA.DispIdHost.addAsyncMethods(
		this,
		[
			am.AddDataPartNamespaceAsync,
			am.GetDataPartNamespaceAsync,
			am.GetDataPartPrefixAsync
		],
		partId
	);
};
OSF.DDA.CustomXmlNode=function OSF_DDA_CustomXmlNode(handle, nodeType, ns, baseName) {
	OSF.OUtil.defineEnumerableProperties(this, {
		"baseName": {
			value: baseName
		},
		"namespaceUri": {
			value: ns
		},
		"nodeType": {
			value: nodeType
		}
	});
	var am=OSF.DDA.AsyncMethodNames;
	OSF.DDA.DispIdHost.addAsyncMethods(
		this,
		[
			am.GetRelativeNodesAsync,
			am.GetNodeValueAsync,
			am.GetNodeXmlAsync,
			am.SetNodeValueAsync,
			am.SetNodeXmlAsync
		],
		handle
	);
};
OSF.DDA.NodeInsertedEventArgs=function OSF_DDA_NodeInsertedEventArgs(newNode, inUndoRedo) {
	OSF.OUtil.defineEnumerableProperties(this, {
		"type": {
			value: Microsoft.Office.WebExtension.EventType.DataNodeInserted
		},
		"newNode": {
			value: newNode
		},
		"inUndoRedo": {
			value: inUndoRedo
		}
	});
};
OSF.DDA.NodeReplacedEventArgs=function OSF_DDA_NodeReplacedEventArgs(oldNode, newNode, inUndoRedo) {
	OSF.OUtil.defineEnumerableProperties(this, {
		"type": {
			value: Microsoft.Office.WebExtension.EventType.DataNodeReplaced
		},
		"oldNode": {
			value: oldNode
		},
		"newNode": {
			value: newNode
		},
		"inUndoRedo": {
			value: inUndoRedo
		}
	});
};
OSF.DDA.NodeDeletedEventArgs=function OSF_DDA_NodeDeletedEventArgs(oldNode, oldNextSibling, inUndoRedo) {
	OSF.OUtil.defineEnumerableProperties(this, {
		"type": {
			value: Microsoft.Office.WebExtension.EventType.DataNodeDeleted
		},
		"oldNode": {
			value: oldNode
		},
		"oldNextSibling": {
			value: oldNextSibling
		},
		"inUndoRedo": {
			value: inUndoRedo
		}
	});
};

